[PHP 7.4.11] Mailgunでメール送信

前提: mailgunにアカウントを登録しておく

$ composer require mailgun/mailgun-php kriswallsmith/buzz nyholm/psr7

require 'vendor/autoload.php';
use Mailgun\Mailgun;

$mgClient = Mailgun::create('${api key}');
$domain = "sandbox*.mailgun.org";

$result = $mgClient->messages()->send($domain, array(
    'from'    => 'info@hpscript.com',
    'to'      => '*@gmail.com',
    'subject' => 'Hello',
    'text'    => 'Testing some Mailgun awesomness!'
));

まじかよ。Github通りにやると上手くいく。

mailgun/mailgun-php だけでなく、kriswallsmith/buzz、nyholm/psr7もインストールしないと動かないから注意が必要。

OK、これをLaravelに実装する。

Dovecot

Dovecot is an IMAP and POP3 server that runs on Unix-like operating systems. It is designed and developed with security system in mind, and is developed and released by Timo Sirainen etal.

perl sendmail

#!/usr/bin/perl

require 'getformdata.pl';

# sendmailパス
$sendmail = '/usr/sbin/sendmail';

# フォームデータの取得
%form = plab::getformdata();

# 個々の変数にコピー
$name = $form{'name'};
$from = $form{'from'};
$subject = $form{'subject'};
$message = $form{'message'};

# メールの送信先は固定
$to = 'hoge@gmail.org';

# Fromメールアドレスが空だとエラーになるので、
# 空なら仮に送信先アドレスを入れる
if($from eq ""){
	$from = $to;
}

# sendmailを書き込みオープンする
if(! open(MAIL, "|$sendmail -t")){
	# sendmailの起動ができませんでした
	print "Content-type: text/html\n";
	print "\n";
	print "メール送信に失敗しました。";

	# CGI終了
	exit;	
}

# チェック
$name =~ s/\r|\n//g;
$from =~ s/\r|\n//g;
$to =~ s/\r|\n//g;
$subject =~ s/\r|\n//g;

# ヒアドキュメントを作る
$mailtext = <<"EOM";
From: $name<$from>
To: <$to>
Subject: $subject
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="ISO-2022-JP"

$message
EOM

# パイプを通してsendmailにデータを渡す
print MAIL $mailtext;

close MAIL;
print "Content-type: text/html\n";
print "\n";
print "メールを送信しました。ありがとうございました";

exit;

sendmailはperlと関係なくメール送信プログラム

fsockopen – smtp

Open an internet connection or Unix domain socket connection.

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if(!$fp){
	echo "$errstr ($errno)<br>\n";
} else {
	$out = "GET / HTTP/1.1\r\n";
	$out .= "Host: www.example.com\r\n";
	$out .= "Connection: Close\r\n\r\n";
	fwrite($fp, $out);
	while (!feof($fp)){
		echo fget($fp, 128);
	}
	fclose($fp);
}

MX record

An MX record is a record that defines the mail destination host name for the target domain.

The mail transfer destination host name needs to be registered in A record. Refers to the A record set by the customer and acquires the IP address of the mail server. Therefore, please note that it will not operate normally if A record is not set.

配送先のメールサーバーを決定する際に使用。
ということは、配送先メールサーバーのAレコードって認識であってる?
あれ、結構複雑だなー

mailgun

Transactional Email API Service for Developersと書いてある。
APIベースのメール配信サービスとのこと。
Mailgunでは、毎月10,000通までのメール送信が無料で使えるとのこと。
Google Cloud PlatformのCompute Engineのサードパーティメールサービスとしても提供。

DNSを設定して、Laravelに導入するのね。
うむ、これはテストしないとあかんやつやね。

qbmail

Githubより、qdmail.phpとqdsmtp.phpをダウンロードします。
Github QdmailをPHP7.0に対応させる

require_once('vendor/qdmail.php');
require_once('vendor/qdsmtp.php');
$mail = new Qdmail();
$mail -> errorDisplay(false);
$mail -> smtp(true);

$param = array(
	'host' => 'xxxxx.xsrv.jp',
	'port' => 587,
	'from' => 'hoge@foo.xsrv.jp',
	'protocol' => 'SMTP_AUTH',
	'user' => 'username',
	'pass' => 'password'
);
$mail -> smtpServer($param);

なんか、本家のサイトがあるようなんだが、更新が2008年で止まっている模様。なんだこれは。。
http://hal456.net/qdsmtp/download
qdはあまりニーズがないのかな。

laravelの.envでsmtpを設定

# 初期値

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

# mailtrap.ioから、usernameとpasswordを取得して.envを編集
# password reset buttonを押下

Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required

う。。。

# キャッシュクリア
[vagrant@localhost angel]$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

# 再度password reset buttonを押下

# mailtrapで確認

なるほど。