
もくじ
この記事の概要
ちょっと特殊な構成です。
- メールサーバ、WEBサーバの2台構成
- メールサーバ側
・送信アカウント認証とSMTPtls465のみの管理を行うという特殊なSMTPサーバ
・アドレス管理はPostfixAdminは使わず、Laravelで自作する - WEBサーバ側
Pear::Mailを利用してメールサーバ経由でメール送信を行う
一般的なPostfix+Dovecot+MySQL+PostfixAdmin構成はこちらをどうぞ
仕様
- MySQLのクエリでPostfixのSASLアカウントをシンプルに追加出来る
- 465番SMTPSのみ待ち受け
- WEBサーバからメールをSASL認証後に中継して転送する
postfixバージョン
# postconf | grep mail_version mail_version = 2.10.1
MySQLのクエリでアカウント追加する
例:user1@example.netアドレスを利用出来るようにする
- ユーザ:user1@example.net
- パスワード:PasswordDayo
ドメイン追加
INSERT INTO `domain` (`domain`, `active`) VALUES
('example.net', 1)
ユーザ追加
INSERT INTO `mailbox` (`username`, `password`,`domain`, `active`) VALUES
('user1@example.net', 'PasswordDayo', 'example.net', 1);
他の仕様
- データベース:postfix
- メールサーバホスト:mail1.example.net
- 登録ドメイン1:example.net
登録アドレス:tarou@example.net - 登録ドメイン2:example.com
登録アドレス:hanako@example.com
メールサーバ側
yum groupinstall -y "Development Tools" yum install -y yum-priorities yum install -y epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum install -y gcc httpd httpd-devel mod_ssl libcap-devel yum install -y --enablerepo=remi-php71,epel php php-cli php-devel php-common php-mbstring php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-gd php-gmp php-pdo php-xml php-mcrypt php-fpm php-pear php-opcache php-imap yum install -y cyrus-sasl-*
cyrus-sasl-*のモジュールは重要で見落としやすい。
# vi /etc/php.ini [Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo'
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
yum install -y http://repo.mysql.com/mysql-community-release-el7.rpm yum install -y mysql mysql-devel mysql-server mysql-utilities mysql-community-common
systemctl start mysqld systemctl enable mysqld
# cat /var/log/mysqld.log | grep root 2019-03-06T06:01:10.632243Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: atyGiql(o8jo
# mysql --version mysql Ver 8.0.15 for Linux on x86_64 (MySQL Community Server - GPL)
# vi /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove the leading "# " to disable binary logging # Binary logging captures changes between backups and is enabled by # default. It's default setting is log_bin=binlog # disable_log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M # # Remove leading # to revert to previous value for default_authentication_plugin, # this will increase compatibility with older clients. For background, see: # https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin # default-authentication-plugin=mysql_native_password datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ※下記を追加 collation_server = utf8mb4_ja_0900_as_cs_ks default_authentication_plugin = mysql_native_password default-password-lifetime = 0 ※ ここまで log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
systemctl restart mysqld systemctl enable mysqld systemctl status mysqld
root初期パスワード確認
# grep 'root' /var/log/mysqld.log 2019-03-11T02:29:49.163975Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jpiRfFFe7_?6
rootログイン
# mysql -u root -p mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPassword>'; mysql> DELETE FROM mysql.user WHERE User = ''; mysql> FLUSH PRIVILEGES; mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfixPassword'; mysql> CREATE DATABASE postfix CHARACTER SET utf8; mysql> GRANT ALL ON postfix.* to postfix@localhost; mysql> EXIT;
# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org
vi /etc/postfix/main.cf
myhostname = mail1.example.net
mydomain = example.net
myorigin = $mydomain
inet_interfaces = all
# Enable IPv4, and IPv6 if supported
inet_protocols = all
#mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination =
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks = 172.31.0.0/16, 127.0.0.0/8
#home_mailbox = Mailbox
#home_mailbox = Maildir/
home_mailbox = Maildir/
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_banner = ESMTP unknown
最終行に追加
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
broken_sasl_auth_clients=yes
smtpd_client_restrictions =
# permit_mynetworks,
# reject_rbl_client all.rbl.jp,
# reject_rbl_client list.dsbl.org,
# reject_rbl_client bl.spamcop.net,
# reject_rbl_client relays.ordb.org,
# reject_rbl_client sbl-xbl.spamhaus.org
### clamav
#smtpd_milters = unix:/var/run/clamav/clamav-milter.sock
#non_smtpd_milters = unix:/var/run/clamav/clamav-milter.sock
#milter_default_action = accept
### Postfix admin settings
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/mailuser
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
###TLS
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_received_header = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
# vi /etc/postfix/mysql_virtual_domains_maps.cf user = postfix password = postfixPassword hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain='%u'
vi /etc/postfix/mysql_virtual_mailbox_maps.cf user = postfix password = postfixPassword hosts = localhost dbname = postfix query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = '1'
cp -p /etc/postfix/master.cf /etc/postfix/master.cf.org
465 SMTPSのみ許可する
# vi /etc/postfix/master.cf #smtp inet n - n - - smtpd #smtp inet n - n - 1 postscreen #smtpd pass - - n - - smtpd #dnsblog unix - - n - 0 dnsblog #tlsproxy unix - - n - 0 tlsproxy #submission inet n - n - - smtpd # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING smtps inet n - n - - smtpd # -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING #628 inet n - n - - qmqpd pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr #qmgr unix n - n 300 1 oqmgr tlsmgr unix - - n 1000? 1 tlsmgr
# groupadd -g 5000 mailuser # useradd -u 5000 -g 5000 -d /home/mailuser -s /sbin/nologin mailuser
# cp -p /etc/sasl2/smtpd.conf /etc/sasl2/smtpd.conf.org
# vi /etc/sasl2/smtpd.conf #pwcheck_method: saslauthd #mech_list: plain login pwcheck_method: auxprop auxprop_plugin: sql allowplaintext: yes mech_list: plain login sql_engine: mysql sql_hostnames: localhost sql_user: postfix sql_passwd: postfixPassword sql_database: postfix sql_select: SELECT password FROM mailbox WHERE username = '%u@%r' AND active = '1'
# cd /etc/pki/tls/certs/
# make mail.pem umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \ cat $PEM1 > mail.pem ; \ echo "" >> mail.pem ; \ cat $PEM2 >> mail.pem ; \ rm -f $PEM1 $PEM2 Generating a 2048 bit RSA private key ............+++ ...................................................................................+++ writing new private key to '/tmp/openssl.nZXB5D' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP State or Province Name (full name) []:Tokyo Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:mail1.example.net Email Address []:
# vi /etc/httpd/conf.d/mail1.example.net.conf
<VirtualHost *:443>
ServerName mail1.example.net
DocumentRoot /home/mailuser/public_html
ErrorLog logs/virtual-error_log
CustomLog logs/virtual-access_log combined env=!no_log
<Directory "/home/mailuser/public_html">
AllowOverride all
</Directory>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>
# mkdir /home/mailuser/public_html
# vi /home/mailuser/public_html/index.php <?php echo "http://mail1.example.net/";
chmod 711 /home/mailuser chmod 711 /home/mailuser/public_html
systemctl restart httpd systemctl enable httpd
yum install wget cd /usr/local/src/ wget https://files.phpmyadmin.net/phpMyAdmin/4.6.4/phpMyAdmin-4.6.4-all-languages.zip unzip phpMyAdmin-4.6.4-all-languages.zip rm -rf phpMyAdmin-4.6.4-all-languages.zip mv phpMyAdmin-4.6.4-all-languages /home/mailuser/public_html/xxxphpMyAdmin
mysql> use postfix;
CREATE TABLE `domain` (
`id` int auto_increment,
`domain` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `domain` (`domain`, `active`) VALUES
('ALL', 1),
('example.net', 1),
('example.com', 1);
CREATE TABLE `mailbox` (
`username` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`password` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`domain` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
`created_at` timestamp,
`updated_at` timestamp,
PRIMARY KEY (`username`),
KEY `domain` (`domain`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `mailbox` (`username`, `password`, `domain`, `active`) VALUES
('tarou@example.net', 'passwordDeath', 'example.net', 1),
('hanako@example.com', 'passwordDeath', 'example.com', 1);
systemctl restart postfix systemctl enable postfix systemctl status postfix systemctl restart saslauthd systemctl enable saslauthd systemctl status saslauthd
WEBサーバ側
# yum install httpd postfix mail php php-* # systemctl enable httpd # systemctl restart httpd
# vi /etc/php.ini [Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo'
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
# pear channel-update pear.php.net Updating channel "pear.php.net" Update of Channel "pear.php.net" succeeded
# pear install -a Mail WARNING: "pear/Auth_SASL" is deprecated in favor of "pear/Auth_SASL2" downloading Mail-1.4.1.tgz ... Starting to download Mail-1.4.1.tgz (21,756 bytes) ........done: 21,756 bytes downloading Net_SMTP-1.8.1.tgz ... Starting to download Net_SMTP-1.8.1.tgz (14,931 bytes) ...done: 14,931 bytes downloading Net_Socket-1.2.2.tgz ... Starting to download Net_Socket-1.2.2.tgz (6,903 bytes) ...done: 6,903 bytes downloading Auth_SASL-1.1.0.tgz ... Starting to download Auth_SASL-1.1.0.tgz (9,380 bytes) ...done: 9,380 bytes install ok: channel://pear.php.net/Mail-1.4.1 install ok: channel://pear.php.net/Net_Socket-1.2.2 install ok: channel://pear.php.net/Auth_SASL-1.1.0 install ok: channel://pear.php.net/Net_SMTP-1.8.1
# vi /var/www/html/mailsend.php
<?php
require_once("/usr/share/pear/Mail.php");
mb_language("japanese");
mb_internal_encoding("UTF-8");
$params = array(
'host' => 'tls://mail1.example.net',
'port' => 465,
'auth' => true,
'username' => 'tarou@example.net',
'password' => 'passwordDeath',
'debug' => false,
'protocol'=>'SMTP_AUTH'
);
$headers = array(
'From' => 'tarou@example.net',
'To' => 'target@hoge.com',
'Subject' => mb_encode_mimeheader(mb_convert_encoding("TEST1643","JIS","UTF-8")),
'Date' => date('r')
);
$recipients = 'target@hoge.com';
$body = mb_convert_encoding("メールの内容","JIS","UTF-8");
$smtp = Mail::factory('smtp', $params);
$e = $smtp->send($recipients, $headers, $body);
if ( PEAR::isError($e) ) echo $e->getMessage() . "\n";
メールが届くことを確認出来た
メールサーバ側
メールアドレス管理アプリ作成
Laravelフレームワークでざっくり作っていきます。
WEBユーザの作成
sudo useradd mailKanri sudo usermod -aG apache mailKanri sudo usermod -aG wheel mailKanri
# visudo ## Same thing without a password %wheel ALL=(ALL) NOPASSWD: ALL
# vi /etc/httpd/conf/httpd.conf #User apache User MailKanri Group apache
httpd -t systemctl restart httpd systemctl enable httpd
Composerインストール
curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer
# mkdir -p /var/www/vhosts/mail1.yuulinux.tokyo/ # composer global require laravel/installer # composer create-project laravel/laravel /var/www/vhosts/mail1.yuulinux.tokyo/project --prefer-dist
chmod 755 /var/www/vhosts/mail1.yuulinux.tokyo/project chmod 755 -R /var/www/vhosts/mail1.yuulinux.tokyo/project/storage chmod 755 -R /var/www/vhosts/mail1.yuulinux.tokyo/project/bootstrap/cache chown mailKanri:apache -R /var/www/vhosts/
ここからはWEBユーザで作業
$ su - mailKanri
DB接続設定
$ vi /var/www/vhosts/mail1.yuulinux.tokyo/project/.env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret ↓変更 DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=postfix DB_USERNAME=postfix DB_PASSWORD=<Postfixパスワード>
プロジェクトに移動
$ cd /var/www/vhosts/mail1.yuulinux.tokyo/project/
$ vi ./composer.json
(略)
"require": {
"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.8.*",
"laravel/tinker": "^1.0",
"laravelcollective/html": "~5.0" ←追加
},
(略)
$ composer update
認証make:auth
$ php artisan make:auth $ php artisan migrate
migrations, password_resets, usersテーブルが作成される
$ vi ./resources/views/layouts/layout.blade.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" media="screen"
>
<link href="/css/sticky-footer.css" rel="stylesheet" media="screen">
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
</head>
<body>
<!-- ヘッダー -->
@include('layouts.partials.header')
<div class="container">
<div class="row" id="content">
<div class="col-md-9">
<!-- コンテンツ -->
@yield('content')
</div>
</div>
</div>
$ mkdir ./resources/views/layouts/partials
$ vi ./resources/views/layouts/partials/header.blade.php <!-- header & grobal navi --> <nav class="navbar navbar-default" style="background-color: #FFFFFF;"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbarEexample2"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/mailbox"> <strong>メール管理</strong> </a> </div> <div class="collapse navbar-collapse" id="navbarEexample2"> <ul class="nav navbar-nav"> <li class="active"><a href="/mailbox/">メニュー</a></li> <li><a href="/mailbox/add">新規登録</a></li> </ul> </div> </div> </nav>
$ vi ./resources/views/layouts/partials/footer.blade.php <!-- footer --> <footer class="footer"> <div class="container"> <p class="text-muted">Copyright (C) メールアドレス管理システム運営委員会 All Rights Reserved.</p> </div> </footer>
Mailboxリクエストの作成
$ php artisan make:request MailboxRequest
メールアドレス追加時のバリデーションルール
$ vi ./app/Http/Requests/MailboxRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MailboxRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
//return false;
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => 'required|email|unique:mailbox,username',
'password' => 'required',
];
}
public function messages()
{
return [
'email.required' => 'メールアドレスを必ず入力して下さい。',
'email.email' => 'メールアドレスを確認して入力して下さい。',
'email.unique' => '既にメールアドレスは存在しています。',
'password.required' => 'パスワードは必ず入力して下さい。',
];
}
}
Mailboxモデルの作成
$ mkdir ./app/Models $ php artisan make:model Models/Mailbox
$ vi ./app/Models/Mailbox.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
class Mailbox extends Model
{
protected $table = 'mailbox'; // テーブル名
protected $primaryKey = 'username'; // PK
protected $guarded = array('username'); // PK
public function getList(){
$items = DB::table('mailbox')
->select('mailbox.username', 'mailbox.password', 'mailbox.domain', 'mailbox.active')
->orderBy('mailbox.created_at', 'DESC')
->paginate(3);
return $items;
}
public function add($request){
$email = $request->email;
$emailArray = explode('@', $email);
$name = $emailArray[0];
$domain = $emailArray[1];
$param_domain = [
"domain" => $domain,
"active" => $request->active,
];
$param_mailbox = [
"username" => $email,
"password" => $request->password,
"domain" => $domain,
"active" => $request->active,
'created_at' => now(),
'updated_at' => now(),
];
//DBに保存
DB::insert('INSERT INTO domain (domain, active)
VALUES(:domain, :active)', $param_domain);
DB::insert('INSERT INTO mailbox (username, password, domain, active, created_at, updated_at)
VALUES(:username, :password, :domain, :active, :created_at, :updated_at)', $param_mailbox);
}
public function show($request){
$username = $request->username;
$item = DB::table('mailbox')->where('mailbox.username', $username)
->select('mailbox.username', 'mailbox.password', 'mailbox.domain', 'mailbox.active')
->get()->first();
return $item;
}
public function edit($request){
$username_id = $request->username_id;
$param = [
"username" => $request->username,
"password" => $request->password,
"active" => $request->active,
'updated_at' => now(),
];
DB::table('mailbox')->where('username', $username_id)->update($param);
}
}
Mailboxコントローラの作成
$ php artisan make:controller MailboxController
$ vi ./app/Http/Controllers/MailboxController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Mailbox;
use App\Http\Requests\MailboxRequest;
class MailboxController extends Controller
{
public function index(){
$mailbox = new Mailbox();
$items = $mailbox->getList();
return view('mailbox.index', ['items' => $items]);
}
public function mailbox_add(){
return view('mailbox.add');
}
public function create(MailboxRequest $request){
$mailbox = new Mailbox();
$mailbox->add($request);
return redirect('/mailbox/');
}
public function mailbox_edit(Request $request){
$mailbox = new Mailbox();
$item = $mailbox->show($request);
return view('mailbox.edit', ['item' => $item]);
}
public function edit(Request $request){
$mailbox = new Mailbox();
$authFlg = $mailbox->edit($request);
return redirect('/mailbox');
}
public function mailbox_act(){
return view('mailbox.act');
}
}
ビューの作成
$ mkdir ./resources/views/mailbox/
index
$ vi ./resources/views/mailbox/index.blade.php
@extends('layouts.layout')
@section('title', 'メールアドレス一覧')
@section('content')
<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
<h1><small>メールアドレスリスト</small></h1>
</div>
<style>
td, th {
padding: 5px 10px;
}
</style>
<table id="rowspan" cellspacing="0" class="tablesorter" border="1" >
<thead>
<tr>
<th width="20%">ユーザ名(メールアドレス)</th>
<th width="20%">パスワード</th>
<th width="22%">アクティブ</th>
<th width="20%">操作</th>
</tr>
</thead>
@foreach($items as $item)
<tbody>
<tr><td>{{$item->username}}</td><td>{{$item->password}}</td><td>{{$item->active}}</td><td><a href="/mailbox/edit?username={{$item->username}}">編集</a></td></tr>
</tbody>
@endforeach
</table>
{{ $items->links() }}
@endsection
メールアドレスの追加
$ vi ./resources/views/mailbox/add.blade.php
@extends('layouts.layout')
@section('title', 'メールアドレス一覧')
@section('content')
<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
<h1><small>メールアドレスリスト</small></h1>
</div>
<style>
.error {
color: red;
}
</style>
@if(count($errors) > 0)
<span class="error" ><p>入力に問題があります。再入力して下さい。</p></span>
@endif
<table class="table table-striped table-hover">
{{Form::open(['action' => 'MailboxController@create', 'files' => false])}}
<tr><th>メールアドレス</th><td><input type="text" name="email"></td></tr>
@if($errors->has('email'))
<tr><th><span class="error" >エラー!</span></th><td><span class="error" >{{ $errors->first('email') }}</span></td></tr>
@endif
<tr><th>パスワード</th><td><input type="text" name="password"></td><td></td></tr>
@if($errors->has('password'))
<tr><th><span class="error" >エラー!</span></th><td><span class="error" >{{ $errors->first('password') }}</span></td></tr>
@endif
<tr><th></th><td><input type="submit" value="追加"></td><td></td></tr>
<input type="hidden" name="active" value="1">
{{Form::close()}}
</table>
@endsection
メールアドレス編集ページ
$ vi ./resources/views/mailbox/edit.blade.php
@extends('layouts.layout')
@section('title', 'メールアドレス一覧')
@section('content')
<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
<h1><small>メールアドレスリスト</small></h1>
</div>
<style>
td, th {
padding: 5px 10px;
}
</style>
<table id="rowspan" cellspacing="0" class="tablesorter" border="1" >
{{Form::open(['action' => 'MailboxController@edit', 'files' => false])}}
{{ csrf_field() }}
<input type="hidden" name=username_id value="{{$item->username}}">
<thead>
<tr>
<th width="20%">ユーザネーム(メールアドレス)</th>
<th width="20%">パスワード</th>
<th width="22%">アクティブ</th>
<th width="20%">操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="text" name="username" value="{{$item->username}}"></td>
<td><input type="text" name="password" value="{{$item->password}}"></td>
<td><select name="active">
<option value="{{$item->active}}" selected>{{$item->active}}</option>
@if($item->active == 0)
<option value="1">1</option>
@endif
@if($item->active == 1)
<option value="0">0</option>
@endif
</select>
</td>
<td>{{ Form::submit('編集実行', ['class' => 'btn']) }}</td>
</tr>
</tbody>
</table>
@endsection
ルーティング
$ vi /var/www/vhosts/mail1.yuulinux.tokyo/project/routes/web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
//Route::get('/', 'HomeController@index')->name('home');
Route::get('/', 'MailboxController@index')->middleware('auth');
Route::get('/mailbox', 'MailboxController@index')->middleware('auth');
Route::get('/mailbox/add', 'MailboxController@mailbox_add')->middleware('auth');
Route::post('/mailbox/add', 'MailboxController@create')->middleware('auth');
Route::get('/mailbox/edit', 'MailboxController@mailbox_edit')->middleware('auth');
Route::post('/mailbox/edit', 'MailboxController@edit')->middleware('auth');
ログイン後のリダイレクト先変更
$ vi ./app/Http/Middleware/RedirectIfAuthenticated.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
//return redirect('/home');
return redirect('/mailbox');
}
return $next($request);
}
}
アカウントの作成
https://IPアドレス/register
レジスターにアクセスしてアカウントを作成して下さいね~!
ログイン

https://IPアドレス/login

ログイン出来た

編集ページ
アクティブ1でSMTPアカウントは有効、0にするとそのアカウントではSMTP認証出来なくなる仕様です。
ログイン出来たらレジスターの無効化
$ vi ./app/Http/Controllers/Auth
public function __construct()
{
$this->middleware('guest');
}
↓変更
public function __construct()
{
//$this->middleware('guest');
abort(404);
}
メールサーバ側のWEBにはIP制限をかけるなどしたほうが良いでしょう。


