質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

5195閲覧

PHPのmail関数でGmailのSMTPサーバーを使用してメールを送信したい

apricot-works

総合スコア15

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/12 09:28

編集2019/06/13 02:56

別の方が作成したメールフォームを移行しています。
そのメールフォームはPHPのmail関数を使用してメールを送信しています。

ある事情から移行先ではGmailのSMTPサーバーを使用してSMTP認証でメールを送信したいのですが、調べてみたらPHPのmail関数でSMTP認証するのは大変そうなことが分かりました。

また、メールフォームのプログラムは複雑に作り込まれていて、できれば手を加えたくありません。

サーバーの設定あるいはPHPの設定で何とかなる方法はないでしょうか。
移行先のサーバーはさくらのレンタルサーバーです。

※以下、追記内容となります。

あまり詳しくないので、上手く説明できないのですが・・・。
メールフォームの管理者宛てメールアドレスが「info@example.com」とします。
この「info@example.com」はGSuiteを使用しています。ビジネス用Gmailみたいなものです。
メールフォームのWEBサーバーはさくらのレンタルサーバーで、ドメインは「https://example.com」となります。
ドメインはお名前で管理しています。
mail関数(sendmail)で「info@example.com」に送信しようとすると、
メールアドレスがWEBサーバーと同一ドメインなのでGmailのほうではなく、
サーバー内部のメールアドレスへ送信しようとしてしまうらしく、Gmail側にメールが届きません。
さくらのレンタルサーバー側には「info」のメールアドレスは作成していません。
下記URLと同じような状況です。
参照:同一ドメインで、Webとメールを別サーバで運用したときのメール送信問題

上記のような理由により、sendmailではなくSMTP認証にて外部SMTPサーバーを使用してメールを送信したいのです。
今回はその外部SMTPサーバーがGmailのSMTPサーバーとなっています。

ちなみにメール送信部分のコードは以下の通りです。

PHP

1 function sendmail($from, $to, $reply_to, $subject, $body, $mail_encode = 'UTF-8') { 2 3 $this->message = null; 4 $this->mail_encode = strtoupper($mail_encode); 5 $encode_from = $this->_encodeHeader('From', $from); 6 $encode_to = $this->_encodeHeader('To', $to); 7 $encode_reply_to = $this->_encodeHeader('Reply-to', $reply_to); 8 $encode_subject = $this->_encodeHeader('Subject', $subject); 9 $encode_body = $this->_encodeBody($body); 10 $matches = null; 11 12 if(preg_match('/<([0-9a-z\.\-_]+@[0-9a-z\.\-_]+)>$/i', $to, $matches)) $to = $matches[1]; 13 14 $mail_header = array(); 15 $mail_header[] = 'From: ' . $encode_from; 16 $mail_header[] = 'MIME-Version: 1.0'; 17 $mail_header[] = 'Content-Type: text/plain; charset='. $this->mail_encode; 18 $mail_header[] = 'Content-Transfer-Encoding: ' . (strcmp('UTF-8', $this->mail_encode) == 0 ? 'base64' : '7bit'); 19 20 if(strlen($encode_reply_to) > 0) $mail_header[] = 'Reply-To: ' . $encode_reply_to; 21 22 $send_mail = mail($to, $encode_subject, $encode_body, trim(join($this->eol, $mail_header))); 23 24 if($send_mail !== true) $this->message = $send_mail; 25 26 return $send_mail; 27 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/12 09:40

つまり、レンタルサーバーのSMTPを利用せずに自前で用意したいということですよね。 どのようなコードで作りこまれているのか分からないですが、通例でないことをするのであれば、それなりの労力は必要に思います。 可能であればなぜGmailである必要があるのか前提や背景を追記いただけませんか? あとコードも提示可能な範囲でご提示ください。
apricot-works

2019/06/12 12:00 編集

> mts10806さん ありがとうござます! > つまり、レンタルサーバーのSMTPを利用せずに自前で用意したいということですよね。 はいそうです。 > 可能であればなぜGmailである必要があるのか前提や背景を追記いただけませんか? > あとコードも提示可能な範囲でご提示ください。 情報追記させていただきました。 もし何か分かることがあればご教示おねがいいたします。
退会済みユーザー

退会済みユーザー

2019/06/12 11:55

さくらのレンタルサーバー(共用)なら さくらの内部DNSでAレコードとMXレコードが強制的に登録される仕様とどこかに書いてあったと思いますが
apricot-works

2019/06/12 11:59

> asahina1979 さん DNSとか何とかレコードとかに詳しくなくてよく分からないのですが・・・。 > さくらのレンタルサーバー(共用)なら さくらの内部DNSでAレコードとMXレコードが強制的に登録> される仕様とどこかに書いてあったと思いますが これはつまりどういうことなのでしょうか?
退会済みユーザー

退会済みユーザー

2019/06/12 12:04

レンタルサーバー内からのMXレコードの問い合わせ と 自PCからのMXレコードの問い合わせ が別の設定(IP)を読み込む
guest

回答3

0

ベストアンサー

別方面の解決案を...


G Suite 側にドメインエイリアスを追加することはできないのでしょうか?

G Suite に現在使用しているドメインのサブドメイン( 例:sub.example.com )をドメインエイリアスとして割り当てて、さくらのレンタルサーバーからは、サブドメイン宛(例えば、user@sub.example.com )に送信するのが簡単なような気がしました。

さくらのレンタルサーバーで G Suite と同じドメイン(exmample.com)を使っていても サブドメイン(sub.example.com)が、G Suite にしか無いなら、サブドメイン宛のメールは問題なくさくらのレンタルサーバーから G Suite 宛に出ていくと思います。

G Suite または Cloud Identity アカウントにドメインを追加する には、

例: Ann は your-company.net で G Suite または Cloud Identity に申し込みました。別に所有している other-company.com ドメインをドメイン エイリアスとして追加すると、Ann やチームメンバーには自動的に両方のドメインのメールアドレスが与えられます。メールはすべて your-company.net の受信トレイで管理されます。

とありますので、G Suite の追加ドメイン宛のメールは、プライマリドメインと同じメールボックスに届くので、受け取る方は変わらないと思います。

投稿2019/06/12 14:32

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apricot-works

2019/06/12 14:42

ご回答ありがとうござます! こちらの方法なら簡単そうですね。 明日G Suiteの管理者に相談してみます。
apricot-works

2019/06/25 07:47

>CHERRY さん 連絡が遅くなりましたが、ご提示いただいた方法で無事解決いたしました。 本当に助かりました!ありがとうございます。
guest

0

下記手順で実現できるかもしれません。

  1. さくらのレンタルサーバの sendmail で使用する submit.mc を用意

(自分のユーザ権限でメールを送信できるように各種パラメーターを調整、submit.cf を作成してそちらを修正でも可)
2. 下記URLの sendmail.mc を参考に submit.mc を修正、auth-infoも作成
https://www.lotar.altervista.org/wiki/en/how-to/sendmail-and-gmail-relay
3. submit.mc から submit.cf を作成
4. mail 関数の additional_parameters で作成した submit.cf を使用してメールを送信するように設定

投稿2019/06/12 12:08

編集2019/06/12 13:13
scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apricot-works

2019/06/12 12:25

> scsiさん ご回答ありがとうござます! 参照サイトのように「/etc/mail」ディレクトリにはレンタルサーバーなのでアクセスできないのですが、 さくらのレンタルサーバーの場合はどこに「submit.cf」等のファイルを作成すればよいか分かりますか?
scsi

2019/06/12 12:26

自分のフォルダに用意して、そのパスを指定すればいいだけです。
scsi

2019/06/12 13:05

ちなみに、私が書いた方法で、 さくらのレンタルサーバからphp の mail 関数を使用して、私の管理するSMTPサーバの587port経由でメール送信できました。 しかし、sendmail に慣れていない人には難しいんじゃないかなーって思います。
apricot-works

2019/06/12 13:07 編集

> scsiさん さくらのレンタルサーバーでできたんですか?? レンタルサーバーではauth-infoファイルのDBマップを作成する際、 makemapを使用する権限がなくDBマップを作成できませんでした。 DBマップを作成できなくても方法はあるでしょうか?
scsi

2019/06/12 13:07

mail関数のadditional_parametersは下記のように指定 mail($to, $subject, $message, $headers, "-C/home/username/submit.cf -f $from");
scsi

2019/06/12 13:07

makemap は 用意した submit.cf を -C で指定したら実行できます。
apricot-works

2019/06/12 13:42

色々ありがとうございます。しかし、試してみましたが、メール送信されませんでした・・・。 間違っている箇所分かりますか?? ``` mkdir -m 700 -p /home/username/mail/auth vi /home/username/mail/auth/auth-info AuthInfo:smtp.gmail.com "U:root" "I:info@example.com" "P:パスワード" cd /home/username/mail vi /home/username/mail/submit.mc define(`SMART_HOST',`smtp.gmail.com')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl FEATURE(`authinfo',`hash /home/username/mail/auth/auth-info')dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') m4 submit.mc > submit.cf cd /home/username/mail/auth makemap -C /home/username/mail/submit.cf -r hash auth-info < auth-info chmod 0600 /home/username/mail/auth/* ``` ``` $send_mail = mail($to, $encode_subject, $encode_body, trim(join($this->eol, $mail_header)), "-C/home/username/mail/submit.cf"); ```
scsi

2019/06/12 13:46

Authinfoの内容が間違っているので、内容の意味を調べて自分の環境にあったものを書いてください。submit.cfは上記以外にも一般権限で動作するようにチューニングする必要があります。 諦められない事情があるなら頑張ってみてください!
scsi

2019/06/12 13:50

いきなりgmailに送信するとデバッグが全く出来ないのでテスト用のログが参照できるメールサーバを用意するといいかと思います! mts10806さんの言う通り、それなりの労力は必要になります!
CHERRY

2019/06/12 14:47 編集

(横からですが...) PHP から sendmail を MSP (メール配信プログラム)として実行するという手があったということを全く思いつきませんでした。 試してみたところ、一応、さくらのレンタルサーバからさくらのVPS経由で送信ができるのは確認できました。 (簡単にできると思っていたけど意外に手間取ったのですが...) 5年ぶりぐらいで sendmail.cf / .mc を触ったけど、sendmail 設定したことがない人にはかなり厳しいかなぁ...
apricot-works

2019/06/12 14:41

色々サポートありがとうございます。 ですが私にはダメでした・・・。挫折します。 別の方法を探ります。
scsi

2019/06/12 16:05

以前この方法でさくらのレンタルサーバーからDKIM署名したメールを送信する実験をしてたので思いついた感じですね。 ユーザID違うけどcoconalaにいるので仕事としてなら設定しますよ。
scsi

2019/06/17 03:28

さくらのコントロールパネル内にドメイン関連の設定で「 このドメイン宛のメールは別サーバで受信する( 上級者向け )」 っていう設定がありますが、こちらは試してみてはどうでしょうか。
apricot-works

2019/06/25 07:45

> scsiさん ご回答ありがとうございます。 ご提示いただいた選択肢は「さくらインターネットで取得したドメインのみ、設定が可能」と注意書きがあり選択不可能でした。。。 >「 このドメイン宛のメールは別サーバで受信する( 上級者向け )」
guest

0

さくらのレンタルサーバー契約してますけど、
メール送信は組んだことがないです。
見たり聞いたりした情報になります。

さくらのレンタルサーバーであれば、
コントロールパネルの、サーバー情報の表示ってところで確認できますが、
ちゃんとsendmailが使えるように用意されています。
PHPのmail()関数はsendmailに引き渡すだけなので、
行けるんじゃないかなぁと思いますが。いかに。

であれば、同じくコントロールパネル上で、メールアドレスの管理というところで、
メール送信用に使うメールアドレスを登録し、
メール送信箇所でGmailのアドレスではなく
(先程登録した)自サーバーのメールアドレスを設定すれば、
送信できそうな気がします。

SPFとかDKIMとかも仕込めばメールの信頼度も確保できそうですし。

投稿2019/06/12 10:59

編集2019/06/12 11:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apricot-works

2019/06/12 12:03

> m6uさん ご回答ありがとうございます! 情報追記しました。もしよろしければ、ご確認ください。 メールアドレスもさくらのレンタルサーバーで管理していればいいのですが、 メールアドレスはGsuiteを使用しているためちょっと困っています。 もし何か分かることがあればご教示おねがいいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問