Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active March 16, 2020 00:34
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kawaz/4152434 to your computer and use it in GitHub Desktop.
Save kawaz/4152434 to your computer and use it in GitHub Desktop.
gmailでメール送信するシェルスクリプト
#!/bin/bash
user="example@gmail.com"
pass="yourpassword"
to="friend@example.com"
( sleep 1
echo "EHLO `hostname`"
sleep 1
echo "AUTH PLAIN $(echo -en "$user\0$user\0$pass" | base64)"
sleep 1
echo "MAIL FROM: <$user>"
sleep 1
echo "rCPT TO: <$to>"
sleep 1
echo "DATA"
sleep 1
( echo "Subject: THIS IS TEST"
echo "From: $user"
echo "To: $to"
echo ""
echo "hello gmail"
echo "hehehe"
echo "."
) | perl -pe's/(?<!\r)\n/\r\n/'
sleep 1
echo "quit"
) | openssl s_client -connect smtp.gmail.com:465
@kawaz
Copy link
Author

kawaz commented Nov 27, 2012

ポイント

  • ホントはgmailの正常レスポンスを受けて次に行くべきですがOKが返ってくる事を見越しつつsleepで手抜き待ち
  • RCPT TOと大文字で書くと行頭のRがopensslのs_client的にRENEGOTIATINGの意味になっておかしなことになるのでそこだけあえて小文字にする(多分本文でも同じでopensslのs_clientを使う限り行頭にRが使えません)。
  • あと、DATA以降は改行コードが\nのみだけだと足りないので\r\nに変換します

@kawaz
Copy link
Author

kawaz commented Nov 27, 2012

改善点

  • STARTTLSするのが面倒だったので465(smtps)につなぎに行ってるけどs_clientに-starttls smtpオプション付けてやればs_clientがSTARTTLSやってくれるらしいので、その場合は587番ポートでも良い。

@kazuihitoshi
Copy link

すごい参考になりました。それで、ちょっと一部問題がありましたので、修正いただけると大変ありがたいです。
ubuntu16.04の #!/bin/sh だと、 echo -en の箇所が -en までを表示対象としてしまうため auth に失敗してしまうようです。
echo コマンドは shに組み込みのコマンドのため、このような違いがでてくるように思います。
1行目を #!/bin/bash に変更いただければどこでも動作するのではないかと思います。

@kawaz
Copy link
Author

kawaz commented Jun 19, 2019

@kazuihitoshi bash にしておきました

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment