愛島発電所

QT SOLAR 愛島発電所

本日の発電量
0 kWh
現在の日射量
2 Wh/㎡
現在の外気温
3.1 ℃

(2023/12/05 07:54 更新)

下増田発電所

QT SOLAR 下増田発電所

本日の発電量
4 kWh
現在の日射量
132 Wh/㎡
現在の外気温
1.2 ℃

(2023/12/05 08:04 更新)

北原東発電所

QT SOLAR 北原東発電所

本日の発電量
3 kWh
現在の日射量
147 Wh/㎡
現在の外気温
1.4 ℃

(2023/12/05 07:46 更新)

長久良辺発電所

QT SOLAR 長久良辺発電所

本日の発電量
5 kWh
現在の日射量
87 Wh/㎡
現在の外気温
-1.2 ℃

(2023/12/05 07:56 更新)

白坂発電所

QT SOLAR 白坂発電所

本日の発電量
2 kWh
現在の日射量
109 Wh/㎡
現在の外気温
0.0 ℃

(2023/12/05 07:55 更新)

清水沢発電所

QT SOLAR 清水沢発電所

本日の発電量
4 kWh
現在の日射量
89 Wh/㎡
現在の外気温
-2.5 ℃

(2023/12/05 07:47 更新)

メール送信 | Perlで作るサーバーサービス

アラートメールの送信等を行うための外部のメールサーバーとのSMTPによる通信を実現します。TLS/STARTTLS (587) に対応しています。

  • TLSによるSSL通信(暗号化)専用
  • 添付ファイル対応

SMTP over SSL (465) ではなく、SMTP TLS/STARTTLS (587)なので、ポートの指定は、587(通常)となります。

Gmailも使えますがログインとセキュリティから「安全性の低いアプリの許可: 有効」にする必要があります。

package SmtpUtility;
use strict;
use IO::Socket::SSL;
use MIME::Base64;
sub     new
{
my $class = shift;                          # クラス名()
my $self = {
};
bless $self,$class;
return $self;
}
sub request
{
my($self) = shift;
my(
$server,         # mail.example.com(:587)
$account,        # mail account
$password,       # mail password
$from,           # from@mailaddress.com
$to,             # to@mailaddress.com
$subject,        # subject
$body,           # mail body
$ref_attached    # reference to file_hash("filename"=>"data")
) = @_;
my $boundary = "----------boundary". time . "_" . $$;
my ($host, $port, $socket, $receive, @keys);
$account = encode_base64($account,'');
$password = encode_base64($password,'');
$subject = encode_base64($subject,'');
$body = encode_base64($body,'');
$body =~ s/.{76}/$&\n/g;
if($server =~ /^(.+?):*(.\d+|)$/){
($host, $port) = ($1, $2);
}else{
die "Invalid Address";
}
if(!$port){
$port = getservbyname('smtp','tcp');
}
$socket = IO::Socket::INET->new (PeerAddr => $host, PeerPort => $port, Proto => 'tcp') or die "$! $host:$port";
sysread($socket,$receive,1024);
print $socket <<END_OF_STARTTLS;
EHLO localhost
STARTTLS
END_OF_STARTTLS
sysread($socket,$receive,1024);
IO::Socket::SSL->start_SSL($socket, SSL_hostname => $host ) or die $SSL_ERROR;
print $socket "AUTH LOGIN\n";
sysread($socket,$receive,1024);
print $socket "$account\r\n";
sysread($socket,$receive,1024);
print $socket "$password\r\n";
sysread($socket,$receive,1024);
print $socket "MAIL FROM: <$from>\r\n";
sysread($socket,$receive,1024);
print $socket "RCPT TO: <$to>\r\n";
sysread($socket,$receive,1024);
print $socket "DATA\r\n";
sysread($socket,$receive,1024);
print $socket <<END_OF_HEADER;
MIME-Version: 1.0
Content-Type: Multipart/Mixed; boundary=$boundary
Content-Transfer-Encoding:Base64
From: $from
To: $to
Subject: =?utf-8?B?$subject?=
END_OF_HEADER
print $socket <<END_OF_BODY;
--$boundary
Content-Transfer-Encoding: base64
Content-Type: text/plain;
charset=UTF-8
$body
END_OF_BODY
@keys = keys(%$ref_attached);
foreach( @keys ){
my($filename) = $_;
my($name) = $_;
$filename =~ s/(\W)/'%'.unpack("H2", $1)/ego;
$name =~ s/(\W)/'='.unpack("H2", $1)/ego;
my($data) = encode_base64($$ref_attached{$_},'');
$data =~ s/.{76}/$&\n/g;
print $socket <<END_OF_ATTACHMENT;
--$boundary
Content-Disposition: attachment;
filename*=utf-8''$filename
Content-Type: application/octet-stream;
name="=?utf-8?Q?$name?="
Content-Transfer-Encoding: base64
$data
END_OF_ATTACHMENT
}
print $socket "--$boundary--\r\n.\r\n";
sysread($socket,$receive,1024);
close($socket);
}
1;

使い方。

#!/usr/bin/perl
use SmtpUtility;
my $mail = SmtpUtility->new();
my $server = 'smtp.hoge.jp:587';
my $account = 'from@hoge.hp';
my $password = 'yourpassword';
my $from = 'from@hoge.jp';
my $to = 'to@foo.bar';
my $subject = "添付ファイル付きメールテスト";
my $body = <<EOD;
これはテストです。
ファイルを添付しましたのでご確認下さい。
EOD
my $file = "./image.jpg";
my $buf;
my $size = -s $file;
open(IN, $file);
binmode(IN);
read(IN, $buf, $size);
close(IN);
my %attachment = (
'image.jpg' => $buf
);
$mail->request(
$server,
$account,
$password,
$from,
$to,
$subject,
$body,
\%attachment
);

今後検討すべきこと

  • Gmailへの完全対応
  • エラー処理