XAMPPで送信専用SMTPリレーサーバ(Mercury)を作る

2022-06-20

ネットワークが繋がっているイメージ画像。線と点がいくつも描かれているイラスト。

積極的に使うことは少ないと思いますが、XAMPPではMercuryがメールサーバとしてインストールできます。

直接外部のネットワークに繋がる場合はほとんど必要ありませんが、職場の閉じたネットワークから外部にメールを送るためにMercuryを使ったSMTPリレーサーバを立てることになったので、使い方と手順を記録します。

SMTPリレーサーバ

SMTPリレーサーバは自身がSMTPサーバとして受け取ったメールを、目的のメールサーバに接続を中継するサーバです。

現在は送信元ユーザからメールを受け取ったSMTPサーバが目的のSMTPサーバに直接送信する事が多いですが、メール送信数が多い場合や今回のように直接メールサーバに接続できない場合はSMTPリレーの仕組みを使う場合があります。

先日、電子メールの仕組みを改めて学習しました。

導入の経緯と使い方

仕事で閉じたネットワーク内で使っているPCがありますが、定期的なバッチ処理を実行しています。バッチ処理終了後はメールで結果を送ってもらえると楽ですが、直接外部に接続する事は避けたかったので今まではPCで直接確認をしていました。

ですが、現在ファイルサーバやWikiサーバとして使っているPCは、複数のNICで内部と外部への接続を分けています。

負荷の低い作業なので安いPCを使ってサーバにしています。

WikiサーバはXAMPPを使っているので、MercuryとSMTPリレーサービスを使えば閉じたネットワーク内からメールを送れる?と考えて試してみました。

簡単な構成図。閉じたネットワークから外部に接続しているサーバへメール送信し、SMTPリレーで外部のSMTPサーバへ接続する。
やりたい事イメージ
メールを送るだけならPCとサーバのネットワーク設定で何とかなりますが、その後の管理を考えると導入したくなかったので今回の方法にしています。

手順

Mercuryの設定

まず、Mercuryを起動し、Admin画面を開きます。

必要なプロトコルだけを起動させるため、Configuration – Protocol module…を選びます。

Mercuryのスクリーンショット

今回は、MercuryS SMTP ServerとMercuryC SMTP relaying clientだけにチェックを入れます。

Mercuryのスクリーンショット

一度Mercuryを停止して再起動し、再度Admin画面を開きます。

次にConfiguration – MercuryS SMTP Serverを選んで、外部へのメールリレーを許可します。

Mercuryのスクリーンショット

Configuration – MercuryC SMTP relaying clientを選んで、外部SMTPサーバの設定を追加します。

Mercuryのスクリーンショット

ポート、暗号化は使用するメールサーバに合わせて下さい。587番ポートとSTARTSSLで基本的には問題無いとは思います。

Mercuryのスクリーンショット

一通り作業が終わった後、File – Send mail message…でテストメールが問題なく送信できれば設定終了です。

Mercuryのスクリーンショット

mercuryをインストールしていない場合

既にXAMPPを使っていて、mercuryをインストールしていない場合は残念ながらXAMPPを再インストールする必要があるようです。

サービスとしてOS起動時に実行

このままだと毎回XAMPPを起動しないといけないため、自動起動を設定します。

確認

Rの解析結果を送りたいのでRで確認しました。

今回は内部から送信されたメールを中継するだけなので、SMTP認証は無くポートも25番ポートから変更していません。そのため、スクリプト内のユーザ名とパスワードはありません。

他のプログラムで送りたい場合も、送信先SMTPサーバをMercuryが動いているPCのIPアドレスに設定すれば同様に動きます(メール送信はからだにいいもの様を参考にしています)。

library("emayili")

email <- envelope()
email <- email %>%
  from("テスト<example@example.com>") %>% 
  to("********") #送信先のメールアドレス
email <- email %>%
  subject("Mercuryを経由して送信")
text <- "Mercuryを経由して送信"
email <- email %>%
  text("{{text}}")

smtp <- server(
  host = "IPアドレス", #XAMPPを動かしているサーバ機のIPアドレス
  port = 25, #ポート番号
)

smtp(email, verbose = TRUE)

無事に届きました。

メールヘッダのスクリーンショット

Mercuryから送るメールサーバはSendGridを使っているため、SPFとDKIMはSendGridになっています。

SMTPリレーサーバを作れば、PCを直接外部のネットワークに接続しなくてもメールを送信することができました(受信にはDNSやゲートウェイの設定が必要です)。