メモだよ
やったこと
1. ✏️ SMTPサーバの情報を調べる
2. ✏️ spring-bootでメールを送る
おまけ. ✏️ 相手に送信できたかどうか調べるには
おまけのおまけ. ✏️ AWS SESとバウンス率
1. ✏️ SMTPサーバの情報を調べる
まずは、サーバにたてたと言われたSMTPサーバの情報を調べます
netstatで、smtpのポートとかを調べる
これで、ポートとかがわかる
# netstat -ap | grep "LISTEN " tcp 0 0 localhost:smtp *:* LISTEN 1316/master # netstat -anp | grep "LISTEN " tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1316/master
2. ✏️ spring-bootでメールを送る
こんな感じで簡単にかけた
MailSender.java
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; @SpringBootApplication public class MailSender implements CommandLineRunner { public static void main(String... args) { SpringApplication.run(MailSender.class, args); } @Autowired public JavaMailSender emailSender; @Override public void run(String... strings) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo("to.address@gmail.com"); message.setFrom("from.address@gmail.com"); message.setSubject("たいとる"); message.setText("テストですよ\nてすとてすと"); message.setReplyTo("reply.address@gmail.com"); emailSender.send(message); } }
resource/application.properties
spring.mail.host=localhost spring.mail.port=25
pom.xmlのdependency
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
おまけ. ✏️ 相手に送信できたかどうか調べるには
まずは、telnetを入れて(CentOSでtelnetできるようにするまでの手順(クライアント・サーバ) | Futurismo)
メールアドレスへの送達確認をしてみる
# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. 220 xxxx.ne.jp ESMTP Postfix helo localhost 250 xxxx.ne.jp mail from:xxxxxxx@gmail.com 250 2.1.0 Ok rcpt to:aaaaaaaaaaa@gmail.com // 存在するメルアド 250 2.1.5 Ok rcpt to:s.bbbbbbbbbbbbbbbb@gmail.com // 存在しないメルアド 250 2.1.5 Ok rset quit Connection closed by foreign host.
参考にしたサイト:メールを送信することなくそのメールアドレスが存在するかどうか調べる - くろの雑記帳
本当は、メルアドが存在する場合はOKを、存在しない場合はNGを返して欲しかったんですが、存在しないメルアドでもOKが返ってきちゃってた。
どうやら、存在するアドレスがバレちゃうとアレだから、ほとんどのサーバでは、結果OKを返すようになっているぽい。
これは、送信する側のメールサーバの作りによるぽい。
で、メールがちゃんと相手に届いたかっていうチェックを、SendFailedExceptionが発生したかしなかったか、で判定したかったんですが、
↑のチェックでOKを返すサーバでは、送信先が存在しないメルアドでも、SendFailedExceptionを出力してくれない。。。
メール送信不可のパターンとしては、こういう感じになっているそうです。
なかなか送達確認はむずかしい・・・。
- SendFailedExceptionをCatchしたら送れていない。
- メールボックスを確認して、「送れませんでした」のメールが届いてたら、送れていない。
- ↑のメールが届いてなかったら、送れていないことに気づけないけど送れていない。
おまけのおまけ. ✏️ AWS SESとバウンス率
メールが送れなかった率をバウンス率といいます。
AWSで安価にメールを遅れるサービスのSESでメールを使うとき、バウンス率には注意が必要。
ここに、こんな記載があります。
Amazon SES 送信アクティビティのモニタリング - Amazon Simple Email Service
抜粋
Amazon SES には、送信アクティビティをモニタリングするための方法が用意されています。これらの方法を実装し、アカウントのバウンス率、苦情率、拒否率などの重要な指標を追跡することをお勧めします。バウンス率や苦情率が高すぎると、Amazon SES での E メール送信に支障が生じる場合があります。
webを漁ってみましたが、どうやらバウンス率が5%を越えると、SESのサービス自体を凍結されてしまうっぽいです。
以上。メモでした。
2017/9/24 追記
みなさまから教えていただいた情報によると、メールが届いたかどうかというのは、開封率で計測するのがよさそう。
なるほど。コンバージョンはSendGridだとGoogle Analytics設定して追うぐらいですねぇ。ちなみ別サービスってどこですか??アクロクエストさんがどういうの利用されるのか気になります(^^)w やはりAmazon SESとかその他海外系ですかねー。
— キクタロー@エバスク役職ボッター (@kikutaro_) 2017年9月22日
メールが無事に届いていても、スパムトラップというものがあるらしく、そういう視点からも、「ちゃんとメールが開かれたな。」という確認は大切😂
スパムトラップの説明はここがめっちゃわかりやすい!! -> スパムトラップとは?その仕組みと回避策 | SendGridブログ
作り込むのであれば、POPサーバーと紐付けて、バウンスメールをハンドリングして、送ったメールアドレスとバウンスメールが返ってきちゃったメールアドレスを紐付ける方法がある。
他にも、せっかくメールが届いても迷惑メールとして扱われてしまう可能性がある😭
ので、SPFとかDKIMとかを気にしなきゃいけない😭😭
送信ドメインを認証するためのSPFレコードに詳しくなろう | SendGridブログ
結局は、サービスを使っちゃった方がよさそう…!
送るだけは簡単だけど、ちゃんと届けるのはめちゃめちゃめんどいし、労力はなかなか報われません。さくさくっとSendGridサインアップ! https://t.co/ldgXXtKD5i
— 山本 ユウスケ (@yusuke) 2017年9月22日
メール送信サービスは、SendGridとかAWS SESとか!
宛先クリーニングサービスには、BriteVerifyとかがあるらしいです!
諸々と情報をいただき、ありがとうございます!!!😭✨✨✨