質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

2回答

1218閲覧

WSL2上のUbuntuからローカルホストのSMTPへのアクセス方法

holiholi_777

総合スコア10

0グッド

0クリップ

投稿2023/09/26 05:07

編集2023/09/26 08:07

実現したいこと

WSL2上のUbuntuで組んでいるメール送信プログラムから
ホストマシンに立てているSMTPサーバーへのメール送信を実現したい。

前提

Javaでメール送信プログラムを組んでいます。
環境は以下の通りです。

メール送信プログラム側の環境

WSL2上のUbuntu

shell

1$ lsb_release -a 2No LSB modules are available. 3Distributor ID: Ubuntu 4Description: Ubuntu 20.04.6 LTS 5Release: 20.04 6Codename: focal 7 8$ ip -br address 9lo UNKNOWN 127.0.0.1/8 ::1/128 10eth0 UP 172.20.113.35/20 fe80::215:5dff:fe73:ac45/64

ホスト側のSMTPサーバー側の環境

smtp4dev
Version: 3.2.0-ci20221023104

発生している問題・エラーメッセージ

org.apache.commons.mail.EmailException: Sending the email to the following server failed : [host_name]:25

host_nameでpingは通っています。
ただ、ポート25を指定した場合のnpingは通りません。

ポートを開いてあげれば行けるのかと思っていますが、どのように行えばいいのか手順がわかりません。
わかる方ご教授をお願い致します。

現状の追記

現状ローカルマシンでsmtp4devを疑い、FackSMTPを使用してC#でローカルでメール送信プログラムを組んでみたところ、送信が行えました。

目的(smtp4devの動作確認として同様のメール送信をFackSMTPを使用して行う)

環境

C#.net (Coreじゃない方)

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleMailSample 8{ 9 internal class Program 10 { 11 static void Main(string[] args) 12 { 13 var host = "ローカルのホスト名(Windowsのipconfig /allで出てくるホスト名)"; 14 var port = 25; 15 var userName = "sample.user"; 16 var password = "sample.pass"; 17 var fromAddress = "sample.user@hogehoge.com"; 18 var toAddress = "to.user@higehige.com"; 19 20 var msg = new MimeKit.MimeMessage(); 21 msg.From.Add(new MimeKit.MailboxAddress(userName, fromAddress)); 22 msg.To.Add(new MimeKit.MailboxAddress("to.user", toAddress)); 23 24 msg.Subject = "testmail" + DateTime.Now.ToString(); 25 26 var mainMessage = new MimeKit.TextPart("Plain"); 27 mainMessage.Text = "test mail"; 28 msg.Body = mainMessage; 29 30 using (var sc = new MailKit.Net.Smtp.SmtpClient()) 31 { 32 try 33 { 34 Console.WriteLine("送信開始"); 35 sc.Connect(host, port, MailKit.Security.SecureSocketOptions.Auto); 36 sc.Authenticate(userName, password); 37 sc.Send(msg); 38 sc.Disconnect(true); 39 40 } 41 catch (Exception ex) 42 { 43 Console.WriteLine(ex); 44 } 45 finally 46 { 47 Console.WriteLine("送信終了"); 48 } 49 } 50 51 Console.ReadLine(); // 待機 52 53 } 54 } 55} 56

C#側では、FackSMTPでは動いてsmtp4devでは動作しなかったので、toge_さんのメッセージついては読んで、確認をしてみます。

今後は、mailtrapを使用して、外部向けにテストメール送信をC#とJavaで実装してみて実行結果を見ます。
実行結果を見て、外部に問題無く届くのであれば、ローカルとWSL2の間の問題なので、この辺は私全く知識が足りていないので、本か何かご存じであれば、教えて頂ければ幸いです。

目的(Java側から同一の環境(FackSMTP)へ向けてのメール送信テスト)

C#側ではメール送信できたので、ローカルのC#ではなくWSL側のJavaからメール送信テスト。
ここれ問題があるのであれば、ホストマシンとWSLの間がうまくいっていないという認識です。
(私の中では)

java

1// ローカルホスト名でpingが通っているし、ローカルホスト名(Windowsのマシン名)を指定してても大丈夫だと思っています。(ここが違ったら指摘願います) 2 private static String _hostName = "ローカルのホスト名(Windowsのipconfig /allで出てくるホスト名)"; 3 private static int _port = 25; 4 private static String _user = "user.sample"; 5 private static String _pass = "pass.ample"; 6 private static String _fa = "user.sample@hogehoge.com"; 7 private static String _ta = "to.user@hogehoge.com";

java

1 private void sendSimpleMail() throws EmailException{ 2 try 3 { 4 var email = new SimpleEmail(); 5 email.setHostName(this._mti.getHostName()); 6 email.setSmtpPort(this._mti.getSmtpPort()); 7 email.setAuthentication(this._mti.getSmtpUser(), this._mti.getSmtpPass()); 8 email.setSSLOnConnect(false); 9 email.setFrom(this._mti.getFromAddress()); 10 email.setSubject(this._mti.getSubject()); 11 email.setMsg(this._mti.getMainMessage()); 12 email.addTo(this._mti.getToAddressList()); 13 if(!StringUtils.isEmpty(this._mti.getCcAddress())) 14 email.addCc(this._mti.getCcAddress()); 15 if(!StringUtils.isEmpty(this._mti.getBccAddress())) 16 email.addBcc(this._mti.getBccAddress()); 17 email.send(); 18 } 19 catch(EmailException e){ 20 throw e; 21 } 22 }

結果

org.apache.commons.mail.EmailException: Sending the email to the following server failed : [host_name]:25

結果エラーとなりました。
mailtrap側への送信はまだ未テストなのでこの後で追加します。

ご回答者の皆様。
ご回答いただきありがとうございます。
引き続きよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hqf00342

2023/09/26 06:49

具体的なコードがないのですがSNMPクライアントプログラムはどこと通信するよう記述しているのでしょうか?[host_name] は具体的にはなんでしょうか。(IPアドレス?FQDN名?) WSL2ではWindowsホストへの通信は/etc/resolv.conf で「nameserver」として記載されたアドレス向けにします。(9月のWSL2 2.0.0へのアップデートで変わっているかもしれません) またSMTPサーバ側は0.0.0.0でLISTENする必要があります。
holiholi_777

2023/09/26 08:10

> [host_name] Windowsのipconfigのホスト名で指定をしています。 これがおかしかったら指摘願います。 pingで、それぞれlocalhostが127.0.0.1でWindowsホスト名が127.0.1.1になっていたので、 Windowsホスト名で良いのかなと思って設定しています。
guest

回答2

0

ベストアンサー

(2023年9月リリースのWSL2 ver2.0.0より前のバージョンを前提とします)

WSL2とWindows間はNATを介しているため、
WSL2側のLinuxからホスト側のWindowsのLISTENポートにアクセスするためにはのNATアドレスへのアクセスが必要です。
WSL内Linux側の/etc/resolv.confにあるnameserverに記載されたアドレスがそのアドレスになります。

そのアドレスに向かって通信を試みてください。
またSNMPサーバ側も外部からアクセスできるように0.0.0.0に対しLISTENしてみてください。

参考:WSL を使用したネットワーク アプリケーションへのアクセス
https://learn.microsoft.com/ja-jp/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip

説明抜粋:


イメージ説明

投稿2023/09/26 10:30

編集2023/09/26 10:35
hqf00342

総合スコア273

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既に実施されているかもしれませんがsmtp4devの起動オプションで--urlsを設定されてますか?

--urls=VALUE The URLs the web interface should listen on. For example, http://localhost:123. Use `*` in place of hostname to listen for requests on any IP address or hostname using the specified port and protocol (for example, http://*:5000)

https://github.com/rnwood/smtp4dev/wiki/Configuration#command-line-options より

これを設定しないとsmtp4devは起動しているOS内からのリクエストしか受けとらないのです。
このためWSLとホスト間のネットワークに問題がなかったとしても、WSLからホストのsmtp4devに接続ができません。

ご参考になれば幸いです。

投稿2023/09/26 07:39

toge_

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問