プログラミング未経験者が、ポートフォリオを作成し、さくらのVPSでサーバー構築して公開しようとした際、最後の関門として立ちはだかったのがメールサーバーの設定です。
参考サイトを見ながら作業すれば何とかなるだろうという甘い考えは打ち砕かれ、思わぬところでドツボにはまってしまったので、同じく未経験者の皆様がメールサーバーを構築される際の一助になればと思い、恥を承知でご紹介させていただきます。
1:私の環境
Postfix:2.10.1
サーバーOS:CentOs7.6.X
PCOS:macOS Mojave 10.14.6
参考サイト:https://www.sakura-vps.net/centos7-setting-list/postfix-settings-for-sakura-vps-centos7/
ドメイン名:便宜上example.comと仮定して記載します。
2:はまったエラーメッセージ
fatal: file /etc/postfix/main.cf: parameter mail_owner: unknown user name value: postfix myhostname = mail.example.com mydomain = example.com
3:まさかの半角スペースがエラーに!?
行頭の空白(半角スペース)が犯人だった!
Postfixの設定前半で登場するのがmain.cfでのホストとドメインの追加です。
以下がエラーの出たコード周辺を抜粋したものです。
ホストとドメインを追加した際に、行頭に半角スペースを無意識で入力していたことがエラーの原因でした。
エラーメッセージの、parameter mail_owner: unknown user name value: postfixという記述から、当初はpostfixというユーザーが追加されていないのかと思いuseraddでpostfixの追加を試みるも「user 'postfix' already exists」と、「すでにpostfixは存在していますよ。」と怒られてしまいます。
unknown user name value: postfixをネット検索するもなかなか有力な手がかりが得られませんでした。
意を決して海外サイトも果敢に調査したところ、たまたま、海外の掲示板で空白が悪さをするという記事を見つけ、解決に至ることができました。
行頭にスペースが入ると、行と行とが繋がってしまうようです。
結局、当初疑っていたmail_owner = postfixの行に誤りはなかったということです。
その後段で追加したホストとドメインが行頭の空白によってpostfixと連結されてしまい、mail_ownerがpostfix myhostname = mail.example.com mydomain = example.comとなってしまった結果、「そんなユーザー知らないですよ。」とエラーが出てしまったということです。
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
# myhostname = host.domain.tld
# myhostname = virtual.domain.tld
myhostname = mail.example.com #この行頭に半角スペースあり!
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
# mydomain = domain.tld
mydomain = example.com #この行頭に半角スペースあり!
4:正しい記述方法
こちらが正しい記述方法です。
参考サイトも行頭にスペースは入っていません!参考サイトの通り記述していればハマることはなかったのでしょう。
無意識に行頭のインデントを合わせようとして半角スペースを入れていたことが、まさかのエラーの原因だったとは、思いもよりませんでした。(プログラミング言語の方では仕様上半角スペースは無視されますし。)
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
# myhostname = host.domain.tld
# myhostname = virtual.domain.tld
myhostname = mail.example.com #この行頭にスペースを入れない!
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
# mydomain = domain.tld
mydomain = example.com #この行頭にスペースを入れない!
5:反省点
エラーメッセージには、value: postfix myhostname = mail.example.com mydomain = example.com
というように、postfixに続けて、私が追加したホストやドメインが表示されています。
最初に、ここのおかしさに気がつけていれば、もっと早くに解決できたと思います。(最初はそういうものだと思ってしまい、特に意識できませんでした。)
また、そもそもインデント処理も、ネスト(入れ子)する際に行うものですし、今回は設定ファイルの編集でしたが、プログラミング言語を書く際も、このようなパターンでインデント処理することは、あまりないかと思われます。
インデント処理すべきルールをしっかり意識できていなかったことも、今回の失敗の要因です。
これまでのポートフォリオ作成でも、ハマった点は大概自分の思い込みや記述誤りによるものです。
初心者ゆえに、やりがちなミスだとは思いますが、きっと誰もが通る道だと思いますので、このような失敗や経験を積み重ねながら、反省と努力を怠らず、さらに成長していきたいと思っています。
最後まで読んでいただき、ありがとうございました。
初心者ゆえ、誤りなどありましたら、ご指摘くださいますよう、お願いいたします。