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

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

ただいまの
回答率

90.45%

  • PHP

    24625questions

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

  • さくらのレンタルサーバ

    16questions

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 174

別の方が作成したメールフォームを移行しています。
そのメールフォームは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サーバーとなっています。

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

    function sendmail($from, $to, $reply_to, $subject, $body, $mail_encode = 'UTF-8') {

        $this->message = null;
        $this->mail_encode = strtoupper($mail_encode);
        $encode_from = $this->_encodeHeader('From', $from);
        $encode_to = $this->_encodeHeader('To', $to);
        $encode_reply_to = $this->_encodeHeader('Reply-to', $reply_to);
        $encode_subject = $this->_encodeHeader('Subject', $subject);
        $encode_body = $this->_encodeBody($body);
        $matches = null;

        if(preg_match('/<([0-9a-z\\.\\-_]+@[0-9a-z\\.\\-_]+)>$/i', $to, $matches)) $to = $matches[1];

        $mail_header = array();
        $mail_header[] = 'From: ' . $encode_from;
        $mail_header[] = 'MIME-Version: 1.0';
        $mail_header[] = 'Content-Type: text/plain; charset='. $this->mail_encode;
        $mail_header[] = 'Content-Transfer-Encoding: ' . (strcmp('UTF-8', $this->mail_encode) == 0 ? 'base64' : '7bit');

        if(strlen($encode_reply_to) > 0) $mail_header[] = 'Reply-To: ' . $encode_reply_to;

        $send_mail = mail($to, $encode_subject, $encode_body, trim(join($this->eol, $mail_header)));

        if($send_mail !== true) $this->message = $send_mail;

        return $send_mail;
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/06/12 20:55

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

    キャンセル

  • apricot-works

    2019/06/12 20:59

    > asahina1979 さん
    DNSとか何とかレコードとかに詳しくなくてよく分からないのですが・・・。

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

    キャンセル

  • asahina1979

    2019/06/12 21:04

    レンタルサーバー内からのMXレコードの問い合わせ

    自PCからのMXレコードの問い合わせ

    が別の設定(IP)を読み込む

    キャンセル

回答 3

checkベストアンサー

+1

別方面の解決案を...


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 23:42

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

    キャンセル

  • 2019/06/25 16:47

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

    キャンセル

+1

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

  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 21:25

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

    キャンセル

  • 2019/06/12 21:26

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

    キャンセル

  • 2019/06/12 22:05

    ちなみに、私が書いた方法で、
    さくらのレンタルサーバからphp の mail 関数を使用して、私の管理するSMTPサーバの587port経由でメール送信できました。

    しかし、sendmail に慣れていない人には難しいんじゃないかなーって思います。

    キャンセル

  • 2019/06/12 22:06 編集

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

    キャンセル

  • 2019/06/12 22:07

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

    キャンセル

  • 2019/06/12 22:07

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

    キャンセル

  • 2019/06/12 22: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");
    ```

    キャンセル

  • 2019/06/12 22:46

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

    キャンセル

  • 2019/06/12 22:50

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

    キャンセル

  • 2019/06/12 23:21 編集

    (横からですが...)

    PHP から sendmail を MSP (メール配信プログラム)として実行するという手があったということを全く思いつきませんでした。

    試してみたところ、一応、さくらのレンタルサーバからさくらのVPS経由で送信ができるのは確認できました。 (簡単にできると思っていたけど意外に手間取ったのですが...)

    5年ぶりぐらいで sendmail.cf / .mc を触ったけど、sendmail 設定したことがない人にはかなり厳しいかなぁ...

    キャンセル

  • 2019/06/12 23:41

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

    キャンセル

  • 2019/06/13 01:05

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

    キャンセル

  • 2019/06/17 12:28

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

    キャンセル

  • 2019/06/25 16:45

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

    キャンセル

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/12 21:03

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

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24625questions

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

  • さくらのレンタルサーバ

    16questions