问题描述

  1. java发邮件无法连接。异常信息如下:
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
  nested exception is:
	java.net.ConnectException: Connection refused: connect
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740)
	at javax.mail.Service.connect(Service.java:388)
	at javax.mail.Service.connect(Service.java:246)
	at javax.mail.Service.connect(Service.java:195)
	at javax.mail.Transport.send0(Transport.java:254)
	at javax.mail.Transport.send(Transport.java:124)
	at Mail.MailUtils2.sendMain(MailUtils2.java:81)
	at Mail.MailUtils2.main(MailUtils2.java:88)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.base/sun.nio.ch.Net.connect0(Native Method)
	at java.base/sun.nio.ch.Net.connect(Net.java:574)
	at java.base/sun.nio.ch.Net.connect(Net.java:563)
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
	at java.base/java.net.Socket.connect(Socket.java:648)
	at java.base/java.net.Socket.connect(Socket.java:597)
	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:359)
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175)
	... 8 more
  1. SMTP服务器25端口用不了。

解决方案

查看网络上博客之后,发现是25端口并没有启动,控制面板-》…-》服务查看不到,即SMTP服务并没有启动。
所以接下来又想怎样下载SMTP服务,但失败。
最后我用Winmail Mail Server替换了易邮服务器,最终java代码运行成功。


第一步,下载&安装Winmail Mail Server

旧版本6.5网址

https://www.winmail.cn/download_old.php

可试用90天。
在这里插入图片描述
安装步骤一直next即可,两个都选择。最终安装后得到:
在这里插入图片描述


第二步,启动Winmail Mail Server,并使用Mail管理工具。

选择上面,开启Mail服务器。应该会弹窗
在这里插入图片描述
可以不用管,这个界面是用email地址密码生成email的第一种方法。可以用方法二,在登录管理工具之后,添加用户生成email。
点击下面一个管理工具,启动界面
在这里插入图片描述

  • 本地主机的意思是,将mail服务器运行在自己的电脑上(一般运行在服务器上)。【1】
  • 远程主机,可以通过第一种添加用户生成的ip地址登录,端口默认即可。
  • 登录用户中的用户名即管理员,不用改。密码是安装时设置的那个。

登录进去第一件事,设置域名管理
在这里插入图片描述
进去第二步,添加用户组&用户。
在这里插入图片描述
在这里插入图片描述
到这个时候,整个Mail服务器上就有了刚刚添加的用户信息,也就是说

  1. 服务器上分配给用户存储,用于存储mail内容。
  2. 用户可以通过mail终端软件,登录mail服务器,查看mail内容。【1】

第三步,使用Foxmail终端软件操作Winmail服务器上mail内容

1. 下载官网

https://www.foxmail.com

2. 登录mail用户

a. 选择其他登录方式
b. 用邮箱名和创建时设置的密码登录即可
c. 设置POP服务器和SMTP服务器。即mail服务器运行的机器ip地址。
在这里插入图片描述

3. 测试一下能否正常发送接收消息。


第四步,正题,运行java代码实现发送邮件

1. 设置用户一的邮件地址和密码,用户二的邮件地址。正常代码运行。代码如下:

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 邮件发送的工具类 使用eyoumailserver,内部账户发邮件
 */
/*
 * javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等
 * javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等
 * javax.mail.Transport:连接邮件SMTP服务器,发送邮件 javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件
 */
public class MailUtils2 {

	private static String userName = "xiaorui@wm.com";// 发送邮件的人
	private static String password = "xiaorui123";// 发送邮件的账户的密码
	private static String userName2 = "xiaotang@wm.com";// 接收邮件的人
	private static String port = "25";// 465、587,默认25

	/**
	 * 该方法用来发送邮件
	 * 
	 * @param to:给谁发邮件
	 **/
	public static void sendMain(String to) throws AddressException, MessagingException {
		// 1、创建连接对象,连接到邮箱服务器
		Properties props = new Properties();
		// 开启debug调试
		props.setProperty("mail.debug", "true");
		// stmp服务器需要进行身份验证,也就是有户名和密码的校验,这样才能通过验证
		props.setProperty("mail.smtp.auth", "true");
		// 发送邮件协议名称
		props.setProperty("mail.transport.protocol", "smtp");
		// 设置邮件服务器主机名
		props.setProperty("mail.host", "127.0.0.1");// 本地"localhost"
		// 设端口号(该配置可写可不写)
		props.setProperty("mail.smtp.port", port);
		
		// Authenticator:认证信息
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);// 使用它给其他账户发邮件
			}
		});

		// 2、创建邮件对象
		Message message = new MimeMessage(session);
		// 2.1设置发件人
		message.setFrom(new InternetAddress(userName));
		// 2、2设置收件人
		message.addRecipient(RecipientType.TO, new InternetAddress(to));
		// 2.3邮件的主题
		message.setSubject("测试发消息");
		// 2.4邮件的正文(即邮件的内容)
		message.setContent("测试邮件:来自xiaorui@wm.com的邮件", "text/html;charset=utf-8");

		// 3.发送邮件
//        Transport trans = session.getTransport();  
//        //连接邮件服务器  
//        trans.connect(userName, password);    
//        //发送邮件  
//        trans.sendMessage(message, message.getAllRecipients());    
//        //关闭连接  
//        trans.close();  

		Transport.send(message);// (两种方式都可以)

		System.out.println("发送成功");
	}

	public static void main(String[] args) {
		try {
			sendMain(userName2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

查看结果,运行成功。

参考:

  1. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
  2. javaMail学习(三)——使用javaMail给易邮邮账户发简单邮件
  3. 使用WinWebMail 简单搭建一个局域网邮件服务 并 测试
  4. 为什么搭建的winmail邮件服务器不能发送Q.Q邮件?
  5. 使用 Winmail Server 轻松架设邮件服务器
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐