スポンサーリンク

Gatamix です。
Raspberry Pi からメール送信の色々を行って見ようと思います。

目次

1.sstmpの設定
2.postfixの設定
3.mailコマンド
4.crontabによる送信
5.pythonによるテキスト送信
6.pythonによるcsvファイル送信
7.pythonによる画像ファイル送信

1.sstmpの設定

Raspberry Piを使ってメールを送る際に使用するstmpサーバーをインストールします。
調べていて使われていたの多かったのがssmtp と postfixです。
この記事では手軽にできそうだったGmailを経由してメールを送信します。
smtpサーバーとしてssmtpのインストールします。
$sudo apt-get install ssmtp

設定ファイルssmtp.confのバックアップファイルを作成します。
$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

2.postfixの設定

smtpサーバーとしてpostfixのインストールします。
pythonを使用して送信する場合は、こちらのほうがいいかもしれません。

インストールコマンド
$sudo apt-get install postfix
途中に選択項目が出てくるのでインターネットサイト を選択します。

パスワードの設定
smtp.gmail.com で起動時にエラーで接続できない場合は、再起動するか直接ipを指定する。
$sudo vi /etc/postfix/sasl_passwd

smtp.gmail.com:587 メールアドレス@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
main.cfに以下追記します。重複している内容は記載しなくていいです。
また、relayhostはsasl_passwdで指定したものと揃えます。

# Minimum Postfix-specific configurations.
#mydomain_fallback = localhost
relayhost=smtp.gmail.com: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

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

3.mailコマンド

メールコマンドを使用するため、mailutilsをインストールします。
$sudo apt-get install mailutils

メール送信のテストをします。
$mail メールアドレス

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

メール送信のログはmail.logに記載されているのでここを確認する。
$cat /var/log/mail.log

4.crontabによる送信

定期的に実行した結果などやlogファイルなどを送信するため、crontabで実行した結果を送信するようにします。出力結果をメールで送信するようにします。

まず、現在のcronjobを確認します。
$crontab -l

cronjobを追加します。
$crontab -e

例(毎日 22:33 に dateコマンドを実行)

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

5.pythonによるテキスト送信

pythonからメール送信を行います。
gatamixがやってみた場合localからリレーするコードはssmtpからは送信エラーとなりました。
pythonからgメールに認証する方法ではできますが、コードにパスワードを記載したくない場合は、postfixのほうがいいかもしれません。(gatamixがssmtpで設定が上手くいっていない可能があります。)

python2.7で実行できたコードです。(送信アドレス、宛先は、適切に設定してください。)

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText

def sendGmail(to, sub, body):
    username = "送信アドレス"
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = username
    msg['To'] = to
    smtp = smtplib.SMTP()
    smtp.connect()
    smtp.sendmail(username, to, msg.as_string())
    smtp.close()
if __name__ == '__main__':
    to = '宛先'
    subject = 'メールタイトル'
    body = '本文'
    sendGmail(to, sub, body)

6.pythonによるcsvファイル送信

Pythonからcsvファイルを送信します。
python2.7で実行するコードです。
通常使っているメールソフトとは違い簡単そのまま貼り付けができないので
csvファイルを一度読み込んでからエンコードをして添付するようです。

#!/Usr/bin/env python                                                                                  
# -*- coding: utf-8 -*-  

import os.path
import datetime
import smtplib

from email import Encoders
from email.Utils import formatdate
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

def create_message(from_addr, to_addr, subject, body, mine, attach_file):

    msg = MIMEMultipart()
    msg["Subject"] = subject
    msg["From"] = from_addr
    msg["To"] = to_addr
    msg["Date"] = formatdate()

    body = MIMEText(body)
    msg.attach(body)

    attachment = MIMEBase(mine['type'],mine['subtype'])

    file = open(attach_file['path'],'rb')
    attachment.set_payload(file.read())
    file.close()
    Encoders.encode_base64(attachment)
    attachment.add_header("Content-Disposition","attachment",filename=attach_file['name'])
    
    msg.attach(attachment)

    return msg

def sendGmail(from_addr, to, msg):
	
    smtp = smtplib.SMTP()
    smtp.connect()
    smtp.sendmail(from_addr, to_addr, msg.as_string())
    smtp.close()
    
if __name__ == '__main__':

    from_addr = "送信アドレス"
    to = "送信先"
    subject = "メールタイトル"
    body = "本文"
    mine={'type':'text','subtype':'comma-separated-values'}

    attach_file={'name':'添付ファイル名','path':'./ファイル名'}
    msg = create_message(from_addr, to, subject, body, mine, attach_file)
    sendGmail(from_addr, to_addr, msg)

7.pythonによる画像ファイル送信

pythonによる画像ファイル送信についてです。
csvファイル送信に少し変更するだけで送信ができます。
ライブラリーのMIMEImageをインポートするのも忘れないようにします。
python2.7で実行するコードです。


import os.path
import datetime
import smtplib

from email import Encoders
from email.Utils import formatdate
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.mime.image import MIMEImage

def create_message(from_addr, to_addr, subject, body, mine, attach_file):

    msg = MIMEMultipart()
    msg["Subject"] = subject
    msg["From"] = from_addr
    msg["To"] = to_addr
    msg["Date"] = formatdate()

    body = MIMEText(body)
    msg.attach(body)

    attachment = MIMEBase(mine['type'],mine['subtype'])
    file = open(attach_file['path'],'rb')
    attachment = MIMEImage(file.read())
    file.close()
    attachment.add_header("Content-Disposition","attachment",filename=attach_file['name'])
    
    msg.attach(attachment)

    return msg

def sendGmail(from_addr, to, msg):
	
    smtp = smtplib.SMTP()
    smtp.connect()
    smtp.sendmail(from_addr, to_addr, msg.as_string())
    smtp.close()
    
if __name__ == '__main__':

    from_addr = "送信アドレス"
    to = "送信先"
    subject = "メールタイトル"
    body = "本文"
    mine={'type':'image','subtype':'png'}

    attach_file={'name':'添付ファイル名','path':'./ファイル名'}
    msg = create_message(from_addr, to, subject, body, mine, attach_file)
    sendGmail(from_addr, to_addr, msg)

以上、Raspberry Pi メール送信のまとめでした。

スポンサーリンク