Python で localhost からリレーしてメール送信

Gatamix です。
Postfix に変更してから、ssmtp では上手くできなかったlocalhost からリレーしての送信ができるようになりました。今まではプログラムからGmailサーバーにアクセス。
それによってpython のプログラムコードにパスワードを直接書かなくてもよくなりました。
具体的には、こんな感じに書けます。

ユーザー認証がなくなったので、コードの一般化ができます。

written by gatamix

ラズパイ(38) SMTPサーバ postfixをつかってみた

Gatamix です。
Raspberry pi のSMTPサーバの構築をssmtp からpostfixに変更しようと試みました。
Gメールへリレーして送信するようにします。
postfix の設定方法
下記リンクを参照しました。

  インストールしていたmailutilsとssmtpをアンインストール
インストール前にmailutilsとssmtp のアンインストールをした。(インストールしていない場合は不要)
$sudo apt-get –purge remove mailutils
$sudo apt-get –purge remove ssmtp

  インストール
postfixのインストールとmailutilsの再インストール。
$sudo apt-get install postfix
インターネットサイト を選択。(設定なしを設定しているホームページもあるがpostfixが起動できなかった。)
$sudo apt-get install mailutils
パスワードの設定
$sudo vi /etc/postfix/sasl_passwd

gmailのipを直接入力:587 gmailのアカウント名@gmail.com:パスワード

(gmailのipを直接入力でなくてsmtp.gmail.comでできればそのほうがいいが、できなかった…)
アクセス権限の変更
$chmod 600 /etc/postfix/sasl_passwd
DB化
$sudo postmap /etc/postfix/sasl_passwd
main.cfの設定変更のまえにバックアップ
sudo cp -i /etc/postfix/main.cf /etc/postfix/main.cf.$(date +%Y%m%d)
main.cfの設定変更
sudo vi /etc/postfix/main.cf
以下追記

# Minimum Postfix-specific configurations.
#mydomain_fallback = localhost
relayhost=gmailのipを直接入力:587
# Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
# Enable Transport Layer Security (TLS), i.e. SSL.
smtp_use_tls=yes
smtp_tls_security_level=encrypt
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
tls_random_source=dev:/dev/urandom

再起動
$sudo postfix reload
または、
$sudo systemctl restart postfix
Raspberry piも再起動してみる。
$sudo reboot

メール送信が上手くできない状況で苦戦していたのですが、
リレーするgmailのipがmail.logに接続できたときログにあった発見して設定ファイルの変更を実行。
直接接続するようにしたら、デーモンで起動したあと再起動なしでメールを送信できました。
サーバーのアドレスが上手く認識できていないことが原因?
この方法だとipが変更されたら、使えなくなりそうです。
以下できなかった時の状況。
Raspberry pi を起動したあとにpostfixを再起動しないと使えない。デーモンは起動している。
Gメールへリレーする際にmail.logを確認するとホスト名かドメイン名でエラーになっていて上手く接続できない。
$cat /var/log/mail.log
を実行すると
status=deferred (Host or domain name not found. Name service error for name=smtp.gmail.com type=MX: Host not found, try again)
とエラーの表示があった。

  postfixについてのメモ
postfixの設定ファイルはmain.cf の他にmaster.cfもある。
場所は、/etc/postfix/master.cf
設定の変更されている箇所は$postconf -n で確認できる。
デフォルト値は$postconf -d で表示される。

written by gatamix

ラズパイ(36) センサーで測定した値をメールで送る

Gatamixです。
センサーを使っての一つの目標だったデータの送信を行ってみました。
使ったセンサーはいつものLPS25Hです。
処理の流れは以下です。
①データの取得(温度、気圧)
②CSVに記録
③プログラムで自動でグラフ作成
④メールでCSVファイルとPNGファイルを送信する
記録:添付ファイルのヘッダーを追加するところでスペルミスをしました。
メールの添付ファイルがファイル名が表示されないという結果があらわれて、
ミスをしてもメールは送信されたので原因が究明に時間がかかりました。
*MIMEについてMultipurpose Internet Mail Extensionsの略である。
電子書式で色々なフォーマットを取り扱うための規格。
ここが間違えると上手く表示されない。


以下コード(長いですが参考までに記載します。)

written by gatamix

ラズパイ(33) mailコマンドでのGメール送信についてメモ

2017.6.20
SSMTP でメールを送ろうとしたら、cannot send message: Process exited with a non-zero status
となりメールが送れない。
メールのログを確認してみた。
$cat /var/log/mail.log
Cannot open smtp.gmail.com:587
というエラーがでていた。
接続ができないためとのエラー、色々試してみるが、なかなか上手くいかない。
587 ポートの確認は以下のコマンド。
$netstat -an|grep 587
ssmtp , mailutils のアンインストールも行った。
$apt-get –purge remove パッケージ名
以上を行っても効果はあまりなかった。
2017.6.21
Gメールをwebから確認。原因が判明。
対策してエラーがなくなった。

written by gatamix

Pythonを使ってcsvファイルをメールする 後半

Gatamix です。
csvファイルをメールするの後半です。
csvデータを取得してその結果をメールするプログラムを作ろうと考えています。
そのために前に作ったプログラムを改造します。
具体的には、
csvを作って、日時の入れたファイルを作成する→メールで送信する。
をやって見ようと思います。
python 2.7で実行できるように書いています。

written by gatamix

Pythonを使ってcsvファイルをメールする 前半

MIKE
Python 3.6でのやり方だよ。Python 2.7とは、モジュールが違うので注意だよ。

pythonから今度は添付ファイルとしてCSVをメールで送信をやってみました。
python2.7では下記リンクを参考にしてやってみました。


ほとんど、違いのないコードなので今回は省略します。
そこでpython 3.6 で同様のことをしてみました。
2.7系のプログラムと下記リンクを参考にして作ってみました。

maintypeとsubtypeを指定するとエラーとなるため、省略しています。
プログラムの修正完了しました。ファイルをopenする際に’rb’が抜けていたためのエラーでした。

KURO
バイナリーで開かないとファイルの形式を指定してもエラーになります。

ライブラリーが一部違うため、結構苦労しました。
あと前回と同様にGメールから送信ができるようにしています。

NIKE
コード内の以下4箇所は適切に設定下さい。
hoge:アカウント名
fuga:送信先
piyo:ファイル添付
pw:ログインパスワード

  プログラムコード

追記
  画像送付するプログラムの場合
imghdrimport imghdrで呼び出します。
attach_file={‘name’:’test.csv’,’path’:’./test.csv’}
のファイル名とパス変更して、
msg.add_attachment(file_read, maintype=“text”,
subtype=‘comma-separated-values’,filename=attach_file[‘name’])
から
msg.add_attachment(file_read, maintype=‘image’,
subtype=imghdr.what(None, file_read),filename=attach_file[‘name’])
に変更します。
subtypeを関数メソッドで自動判定するように変更しています。

  関連記事
関連記事をまとめました。

written by gatamix

Macのコマンドラインからメールを送信する

Macからメールをコマンドラインからgメールを送信できるように設定します。
Pythonでは、プログラム上からsmtpサーバーにアクセスしましたが、
mailコマンドを使う場合は、Postfixの設定ファイルに
サーバーの設定を行います。
なおMacのOSのバージョンによって設定の違いがあるようです。
なので参考までにして下さい。
実行環境はMacbook air :OS X sierra 10.12.4 です。
$sudo vi /etc/postfix/gmail_passwd
以下を記入する。

smtp.gmail.com:587 アカウント名@gmail.com:パスワード

$sudo postmap /etc/postfix/gmail_passwd
ファイルのバックアップをとります。
$cp -i /etc/postfix/main.cf /etc/postfix/main.cf.$(date +%Y%m%d)
$sudo vi /etc/postfix/main.cf
以下をmain.cfに追記する。

relayhost = smtp.gmail.com:587
#SASL Authentication
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter=plain
#TLS Settings
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom
smtp_tls_note_starttls_offer = yes

Postfixを再起動させます。
$sudo postfix reload
立ち上がってない場合は
$sudo postfix start
で立ち上げる。
試しにメールを送信のテストをします。
$date | mail -s test 送信先アドレス
OS X sierra だと mail のログが/var/log/maillogにないため以下でsmtpの通信を確認する。
$sudo log stream –predicate ‘(process == “smtpd”) || (process == “smtp”)’ –info
参考

関連記事をまとめました。

written by gatamix

ラズパイ(21) メールを送信する part3 Pythonからメール

Python からgメールを送ります。
設定はpart1でしています。
phthon のプログラムは以下。
$vi send_mail.py

実行権限をつけます。
$sudo chmod +x send_mail.py
実行して送信します。
$sudo ./send_mail.py
macでPythonからメールを送る方法
上のプログラムからMacからも送信することができます。
macの場合はPostfixを起動させます。

$sudo postfix start
$sudo ./send_mail.py

これでプログラム上からメールを送信させられました。

関連記事をまとめました。

written by gatamix

ラズパイ(20) メールを送信する part2 crontab を使ってメール

Raspberry Pi でメールを送信するの続きです。
今回は、crontab を使ってメールを自動送信してみます。
現在のcronjobを確認します。
$crontab -l
cronjobを設定します。
下記の箱の中の内容を追記します。
$crontab -e
MAILTOの後の実行結果がメールで送信されます。
メールの設定はpart1で設定しています。
分 時間 日 月 曜日 コマンド の順に記載します。

# m h  dom mon dow
MAILTO=送信するメールアドレス
33 11 * * * date

上の例は11:33に毎日実行される設定です。
この設定を実行するとdateコマンドがメールで送信されます。

関連記事をまとめました。

written by gatamix

ラズパイ(19) メールを送信する part1 ssmtpの導入とmailコマンド

Raspberry Pi でメールを送信します。
ssmtpのインストール
$sudo apt-get install ssmtp
mailutils
$sudo apt-get install mailutils
バックアップの作成をします。
$sudo cp -i /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.`date +%Y%m%d`
$sudo vi /etc/ssmtp/ssmtp.conf

以下の内容を修正します。(gmailの場合の例)

root=ユーザー名(xxxx@gmail.com など)
mailhub=smtp.gmail.com:587
AuthUser=ユーザー名(xxxx@gmail.com など)
AuthPass=パスワ-ド
UseSTARTTLS=YES

メール送信のテストをします。
$mail メールアドレス(xxxx@gmail.com など)

Cc:  [enter]
Subject: test [enter]
(本文)test
[control] +[d]

関連記事をまとめました。

written by gatamix