Más contenido relacionado
Más de azumakuniyuki 🐈 (20)
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
- 3. 自己紹介
@azumakuniyuki (東邦之)
株式会社Cubicroot (京都市)
3
- インフラエンジニア(ラック実装から構築・保守)
- *BSD, Linux, 古くはSolaris, SunOS
- ネットワークの設計・サーバの構築と保守
- インフラのコード化支援(Ansible,Serverspec)
- 数年前からプログラマー
- 主にPerl, Rubyも
- サイトの開発(バックエンド)
- メール関連の開発
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 9. 9
- /etc/alternatives/mta
- Postfixと同居しているパターン多い
- /usr/sbin/alternatives(8)で切り替えられる
- /usr/sbin/sendmail.sendmail
- /usr/sbin/sendmail.postfix
必ずある(何かと同居)
/usr/sbin/sendmail
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 10. 10
- Sendmailを駆逐したい勢力
- Sendmailが捨てられて何かに置き換わっている
- /var/qmail/bin/sendmail
- /usr/bin/exim
- macOS $ strings /usr/sbin/sendmail | grep postfix
必ずある(入れ替わってる?)
/usr/sbin/sendmail
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 11. 11
- どれも本家の/usr/sbin/sendmailとある程度の互換性がある
- my $sendmail = '/usr/sbin/sendmail -t';
- php.ini/sendmail_path=
- ; (default: "sendmail -t -i").
- CGI::FormBuilder
- qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/bin/send...
- LWP::Protocol::mailto
- qw(/usr/sbin/sendmail /usr/lib/sendmail /usr/ucblib/s...
存在する前提になってる
/usr/sbin/sendmail
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 12. 12
$ hostname | mail -s 'Nyaan' neko@nyaan.jp
$ ls -laF `which mail`
lrwxrwxrwx ... /usr/bin/mail -> mailx*
$ strings /usr/bin/mailx | grep sendmail
/usr/sbin/sendmail
存在する前提になってる
/usr/sbin/sendmail
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 16. 16
$ netstat -na | grep LISTEN | grep -E ':(25|587)'
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
# /usr/sbin/lsof -i:25
COMMAND PID USER ...
sendmail 2401 root ... localhost:smtp (LISTEN)
MTAでなくても動いてる
127.0.0.1:25
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 17. 17
# mailq -Ac
/var/spool/clientmqueue (1 request)
...
v22IJrNi0022 ... Fri Mar 3 02:22 root
(Deferred: Connection refused by [127.0.0.1])
neko@nyaan.jp
# crontabの結果がメールで来ないとか、いろいろ困る。
動いてないとキューに溜まる
127.0.0.1:25
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 18. 18
動いている前提になっている
localhost:25
- Mail::Sendmail
- 'smtp' => [ qw( localhost ) ],
- Email::Sender
- ::Transport::SMTP
- has host => (..., default => sub { 'localhost' });
- Email::Send::SMTP
- my $host = delete($args{Host}) || 'localhost';
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 22. 22
今は外へメールが送りにくい
192.0.2.222:25
- OP25B: Outbound Port 25 Blocking
- 一般家庭の回線から外部のSMTPへ接続できない
- ISPがブロックしている
- 固定IPアドレスの回線なら外向きのSMTP接続も大丈夫
- SPF: Sender Policy Framework
- DNSのTXTレコードで設定されている
- 「**@nyaan.jpは192.0.2.222からしか送信しませんよ」
- ↑TXTに書いていないとこからのメールは「迷惑メール」行き?
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 26. 26
SMTP認証を経てメール投函
smtp.gmail.com:587
- 587 = Submission
- <input type = 'submit' value = '送信'>
- 素数
- 587番ポートは認証が必須(で設定されているのが殆ど)
- OP25Bな環境では(ほぼ)唯一のメール送信方法
- ほとんどのメールサーバはSubmissionに対応している
- Gmail, Office365, Yahoo!, SendGrid, Amazon SES
- 会社のメールサーバとか(Sendmail, Postfix, ...)
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 28. 28
Net::SMTP or Net::SMTPS
smtp.gmail.com:587
use Net::SMTP; # TLSで通信するならNet::SMTPS;
use Authen::SASL;
my $smtp = Net::SMTP->new('smtp.gmail.com', 'Port'=>587);
my $auth = Authen::SASL->new('callback' => {
'user' => '*******@gmail.com',
'pass' => '********'
};
$smtp->auth($auth);
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 29. 29
Sendmail (/etc/mail)
smtp.gmail.com:587
# grep authinfo sendmail.cf
Kauthinfo hash /etc/mail/authinfo
# vi authinfo
Authinfo:smtp.gmail.com "U:**@gmail.com" "P:**" "M:plain"
# makemap hash authinfo < authinfo
# chmod 0600 ./authinfo
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 30. 30
Postfix (/etc/mail/postfix)
smtp.gmail.com:587
# grep smtp_sasl main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
# vi authinfo
[smtp.gmail.com]:587 ***@gmail.com:****
# /usr/sbin/postmap authinfo
# chmod 0600 ./authinfo*
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 32. 32
「温故」編まとめ
SMTP or Submission
a. /usr/sbin/sendmailが要る
- コマンドラインでも送れるし
b. 127.0.0.1(localhost)の25番ポートでMTAが動いている
- Net::SMTPとか使っても送れる
c. 25番ポートにSMTP接続できる別サーバが要る
- WebサーバでMTAが動いていない時のため
d. 587番ポートで認証できるアカウントとサーバが要る
- OP25Bでブロックされている時
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 35. 35
メール配信サービスのAPI
HTTP API
- 有名且つ大きいところ
- Amazon SES https://aws.amazon.com/jp/ses
- SendGrid https://sendgrid.kke.co.jp/
- 信頼と実績・歴史と伝統のSMTPインターフェイスもある
- Submission(認証して)で送る
- SMTPアレルギーが無いなら楽かも、たぶん。
- HTTP(HTTPS)で送信する方が速い
- 大量に送るならHTTP-APIを使う方が良い
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 36. 36
AmazonSESのモジュール
HTTP API
- Amazon::SES
- 依存: [JSON::XS, Moo, LWP::UserAgent, ...]
- Net::AWS::SES
- 依存: [HTTP::Headers, LWP::UserAgent, MIME::*]
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 37. 37
SendGridのモジュール
HTTP API
- Mojo::SendGrid (Mojolicious)
- 2016年3月に登場した(新しい!)
- Mail::SendGrid
- 2011年からある
- 依存: [HTTP::Tiny, IO::Socket::SSL, JSON, Moo, ...]
- WebService::SendGrid
- 依存: [JSON::XS, Moose, DateTime::Formt::HTTP, ...]
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 38. 38
僕?
HTTP API
use Furl;
my $http = Furl->new(...);
my $mail = {
'to' => 'neko@nyaan.jp',
'from' => 'kijitora@example.jp',
'subject' => 'Nyaan',
'text' => Encode::encode('UTF-8', 'にゃーん'), ... };
$http->post('https://sendgrid.net/api/mail.send.json',, $mail);
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 43. 43
SMTPの良いところ
SMTP or HTTP
- MTAが操作できるなら非常に柔軟なことができる
- 手持ちのSMTP(Submission)アカウントで送信OK
- Gmail, Yahoo!でなくても自前で建てたサーバ経由でもOK
- そもそも昔からある汎用的な技術で枯れている!
- 選択肢が多い
- Sendmail, Postfix, qmail, Exim4, OpenSMTPD, Exchange,
- qpsmtpd
- コマンドラインから手軽に送信(mailx, telnet)
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 44. 44
HTTPの良いところ
SMTP or HTTP
- MTA(SendmailやPostfixとか)が動いてなくてもOK
- そもそもSMTPに関わらなくても良い
- Webサイトに組み込みやすい
- メールキューの監視・管理をしなくても良い
- 外に出やすい(80, 443だけ外出OKとかOP25Bは無関係とか)
- テンプレート機能とかメール送信以外が充実
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 45. 45
SMTPのイマイチなところ
SMTP or HTTP
- MTA(Sendmail, Postfix, ...)が必要になることが多い
- Sendmailは難解と言われる
- PostfixもSMTPの知識が無いと難しい
- キューの管理(たくさん滞留すると大変)
- 国内の携帯電話宛とか特に
- DNSのことも気にせなアカン
- 外出しにくい(OP25BとかSPFとか)
- ロストテクノロジー
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki
- 46. 46
HTTPのイマイチなところ
SMTP or HTTP
- 証明書とか面倒くさい
- ちょっとテストしたいだけやのに
- キューの制御ができない
- 一旦エンドポイントに渡した後は何もできない
- Suppressionリストが共有(Amazon SES)
- 同じリージョン内でバウンスしたアドレスには送れない
- 国内の携帯電話宛では厄介
- バウンス情報が少なすぎる(SendGrid)
YAPC::Kansai 2017 Osaka | 2017/03/04(土) MOTEXさん
メールフォームからメールを送る近代的な方法 @azumakuniyuki