そこに仁義はあるのか(仮)

略してそこ仁!

「SMTPサーバをたてといたから、メール送るプログラム作って」って言われたときのやりかた

メモだよ

やったこと

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.xmldependency

    <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したら送れていない。
  • メールボックスを確認して、「送れませんでした」のメールが届いてたら、送れていない。
  • ↑のメールが届いてなかったら、送れていないことに気づけないけど送れていない。

参考:Guide to Spring Email | Baeldung

おまけのおまけ. ✏️ AWS SESとバウンス率

メールが送れなかった率をバウンス率といいます。
AWSで安価にメールを遅れるサービスのSESでメールを使うとき、バウンス率には注意が必要。

ここに、こんな記載があります。
Amazon SES 送信アクティビティのモニタリング - Amazon Simple Email Service

抜粋

Amazon SES には、送信アクティビティをモニタリングするための方法が用意されています。これらの方法を実装し、アカウントのバウンス率、苦情率、拒否率などの重要な指標を追跡することをお勧めします。バウンス率や苦情率が高すぎると、Amazon SES での E メール送信に支障が生じる場合があります。

webを漁ってみましたが、どうやらバウンス率が5%を越えると、SESのサービス自体を凍結されてしまうっぽいです。

以上。メモでした。

2017/9/24 追記

みなさまから教えていただいた情報によると、メールが届いたかどうかというのは、開封率で計測するのがよさそう。

メールが無事に届いていても、スパムトラップというものがあるらしく、そういう視点からも、「ちゃんとメールが開かれたな。」という確認は大切😂
スパムトラップの説明はここがめっちゃわかりやすい!! -> スパムトラップとは?その仕組みと回避策 | SendGridブログ

作り込むのであれば、POPサーバーと紐付けて、バウンスメールをハンドリングして、送ったメールアドレスとバウンスメールが返ってきちゃったメールアドレスを紐付ける方法がある。

他にも、せっかくメールが届いても迷惑メールとして扱われてしまう可能性がある😭
ので、SPFとかDKIMとかを気にしなきゃいけない😭😭
送信ドメインを認証するためのSPFレコードに詳しくなろう | SendGridブログ

結局は、サービスを使っちゃった方がよさそう…!

メール送信サービスは、SendGridとかAWS SESとか!
宛先クリーニングサービスには、BriteVerifyとかがあるらしいです!

諸々と情報をいただき、ありがとうございます!!!😭✨✨✨