阿里云ECS服务器无法发送邮件问题解决方案

这篇具有很好参考价值的文章主要介绍了阿里云ECS服务器无法发送邮件问题解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章分享一下自己把项目部署在阿里云ECS上之后,登录邮件提醒时的邮件发送失败问题,无法连接发送邮箱的服务器。

博主使用的springboot提供的发送邮件服务,如下所示,为了实现异步的效果,新开了一个线程来发送邮件。

package cn.edu.sgu.www.mhxysy.service.system.impl;

import cn.edu.sgu.www.mhxysy.property.EmailProperties;
import cn.edu.sgu.www.mhxysy.property.SystemSettingsProperties;
import cn.edu.sgu.www.mhxysy.consts.RedisKeyPrefixConst;
import cn.edu.sgu.www.mhxysy.dto.system.UserLoginDTO;
import cn.edu.sgu.www.mhxysy.dto.system.UserUpdateDTO;
import cn.edu.sgu.www.mhxysy.entity.system.User;
import cn.edu.sgu.www.mhxysy.entity.system.UserLoginLog;
import cn.edu.sgu.www.mhxysy.exception.GlobalException;
import cn.edu.sgu.www.mhxysy.feign.FeignService;
import cn.edu.sgu.www.mhxysy.redis.RedisRepository;
import cn.edu.sgu.www.mhxysy.redis.StringRedisUtils;
import cn.edu.sgu.www.mhxysy.restful.ResponseCode;
import cn.edu.sgu.www.mhxysy.service.system.UserService;
import cn.edu.sgu.www.mhxysy.util.IpUtils;
import cn.edu.sgu.www.mhxysy.util.StringUtils;
import cn.edu.sgu.www.mhxysy.util.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author heyunlin
 * @version 1.0
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {

	private final FeignService feignService;
	private final JavaMailSender javaMailSender;
	private final EmailProperties emailProperties;
	private final RedisRepository redisRepository;
	private final StringRedisUtils stringRedisUtils;
	private final SystemSettingsProperties systemSettingsProperties;

	@Autowired
	public UserServiceImpl(
			FeignService feignService,
			JavaMailSender javaMailSender,
			EmailProperties emailProperties,
			RedisRepository redisRepository,
			StringRedisUtils stringRedisUtils,
			SystemSettingsProperties systemSettingsProperties) {
		this.feignService = feignService;
		this.javaMailSender = javaMailSender;
		this.emailProperties = emailProperties;
		this.redisRepository = redisRepository;
		this.stringRedisUtils = stringRedisUtils;
		this.systemSettingsProperties = systemSettingsProperties;
	}

	@Override
	public void logout() {
		// 删除角色的权限
		redisRepository.delete(UserUtils.getLoginUsername());

		// 注销
		UserUtils.getSubject().logout();
	}

	@Override
	public void login(UserLoginDTO loginDTO) {
		// 一、验证码判断
		// 得到用户输入的验证码
		String code = loginDTO.getCode();

		// 获取正确的验证码
		String uuid = loginDTO.getUuid();
		String key = RedisKeyPrefixConst.PREFIX_CAPTCHA + uuid;
		String realCode = stringRedisUtils.get(key);

		// 得到的验证码为空,则获取验证码到登录之间的时间已经过了3分钟,验证码过期已经被删除
		if (realCode == null) {
			throw new GlobalException(ResponseCode.BAD_REQUEST, "验证码已失效,请刷新页面重新获取~");
		}
		// 验证码校验
		if (!code.equalsIgnoreCase(realCode)) {
			throw new GlobalException(ResponseCode.BAD_REQUEST, "验证码错误~");
		}

		// 二、登录流程
		// 得到用户名
		String username = loginDTO.getUsername();
		log.debug("用户{}正在登录...", username);

		// 查询用户信息,如果用户被锁定,提前退出
		User user = feignService.selectByUsername(username);

		if (user != null) {
			if (user.getEnable()) {
				// 1、shiro登录认证
				UsernamePasswordToken token = new UsernamePasswordToken(username, loginDTO.getPassword());
				Subject subject = UserUtils.getSubject();

				subject.login(token);
				// 设置session失效时间:永不超时
				subject.getSession().setTimeout(-1001);

				// 2、修改管理员上一次登录时间
				User usr = new User();

				usr.setId(user.getId());
				usr.setLastLoginTime(LocalDateTime.now());

				feignService.updateById(usr);

				// 3、邮件通知
				if (emailProperties.isEnable()) {
					new Thread(() -> {
						// 定义日期格式
						DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

						MimeMessage message = javaMailSender.createMimeMessage();
						MimeMessageHelper helper = new MimeMessageHelper(message);

						try {
							String text = "您的账号" + username + "在广州登录了。" +
									"[" + LocalDateTime.now().format(formatter) + "]";

							helper.setFrom(emailProperties.getFrom());
							helper.setTo(emailProperties.getTo());
							helper.setText(text);

							javaMailSender.send(message);
						} catch (MessagingException e) {
							e.printStackTrace();
						}
					}).start();
				}

				// 4、如果开启了系统日志,添加管理员登录历史
				if (systemSettingsProperties.isLoginLog()) {
					UserLoginLog loginLog = new UserLoginLog();

					loginLog.setId(StringUtils.uuid());
					loginLog.setUserId(user.getId());
					loginLog.setLoginTime(LocalDateTime.now());
					loginLog.setLoginIp(IpUtils.getLocalHostAddress());
					loginLog.setLoginHostName(IpUtils.getLocalHostName());

					feignService.saveLoginLog(loginLog);
				}

				// 5、从redis中删除用户权限
				redisRepository.delete(username);

				// 6、查询用户的权限信息,并保存到redis
				redisRepository.save(username);
			} else {
				throw new GlobalException(ResponseCode.FORBIDDEN, "账号已被锁定,禁止登录!");
			}
		} else {
			throw new GlobalException(ResponseCode.NOT_FOUND, "用户名不存在~");
		}
	}

	@Override
	public void updatePass(UserUpdateDTO userUpdateDTO) {
		feignService.updatePass(userUpdateDTO);
	}

}

过了一段时间之后,后台打印出了连接邮箱服务器超时的日志。 

Exception in thread "Thread-25" org.springframework.mail.MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout -1;

  nested exception is:

	java.net.ConnectException: Connection timed out (Connection timed out). Failed messages: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout -1;

  nested exception is:

	java.net.ConnectException: Connection timed out (Connection timed out); message exception details (1) are:

Failed message 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout -1;

  nested exception is:

	java.net.ConnectException: Connection timed out (Connection timed out)

	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2210)

	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)

	at javax.mail.Service.connect(Service.java:342)

	at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:518)

	at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:437)

	at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)

	at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)

	at cn.edu.sgu.www.mhxysy.service.system.impl.UserServiceImpl.lambda$login$0(UserServiceImpl.java:135)

	at java.lang.Thread.run(Thread.java:745)

Caused by: java.net.ConnectException: Connection timed out (Connection timed out)

	at java.net.PlainSocketImpl.socketConnect(Native Method)

	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)

	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

	at java.net.Socket.connect(Socket.java:589)

	at java.net.Socket.connect(Socket.java:538)

	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:335)

	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:214)

	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2160)

	... 8 more

原因是:Couldn't connect to host, port: smtp.163.com, 25

但是通过终端连接smtp.163.com是成功的

ping smtp.163.com

阿里云ECS服务器无法发送邮件问题解决方案,linux上部署项目运行环境,开发中遇到的问题,阿里云,服务器,云计算

但是尝试访问25端口,却无响应

telnet smtp.163.com 25

阿里云ECS服务器无法发送邮件问题解决方案,linux上部署项目运行环境,开发中遇到的问题,阿里云,服务器,云计算

于是在网上查找了一些解决方案,最后采用了通过ssl连接的方式,在原来的邮件设置中加入以下设置

spring:
  mail:
    port: 25
    host: smtp.163.com
    default-encoding: UTF-8
    username: xxxxx@163.com
    password: xxxxxxxxxxxxx

    # 以下是新增的设置
    properties:
      mail:
        debug: true
        smtp:
          auth: true
          ssl:
            trust: smtp.163.com
          starttls:
            enable: true
            required: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

最后重启服务,登陆的时候成功发出了邮件。文章来源地址https://www.toymoban.com/news/detail-729223.html

到了这里,关于阿里云ECS服务器无法发送邮件问题解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云服务器ECS云盘扩容

    对于云服务器,相信大多数开发的铁子们都玩过,但是云盘爆满的情况,对于新手或者没有自己运营业务的铁子们,平台给的初始容量也不算小,所以这种情况碰到的概率还是比较小。由于我的服务器应用的复杂度随着业务的发展逐渐增加,今天磁盘满了,导致几个服务直接

    2024年02月06日
    浏览(52)
  • 阿里云服务器ECS可以做什么?

    阿里云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,具有广泛的应用场景,既可以作为Web服务器或者应用服务器单独使用,又可以与其他阿里云服务集成提供丰富的解决方案。阿里云服务器ECS的应用场景有哪些呢? 网站应用 网站初始阶段访问量小,只需要一台低配

    2024年02月11日
    浏览(42)
  • 阿里云服务器ECS有什么优势?

    1.稳定 单实例可用性达 99.975%,多可用区多实例可用性达 99.995%,云盘可靠性达9个9,可实现宕机自动迁移、快照备份 2.弹性 支持分钟级别创建千台实例,多种弹性付费选择更贴合业务现状,同时带来弹性的扩容能力,实例与带宽均可随时升降配,云盘可扩容 3.安全 提供DDoS防

    2024年02月11日
    浏览(47)
  • 阿里云轻量应用服务器和ECS云服务器区别(官方文档)

    阿里云轻量应用服务器和ECS云服务器有啥区别?轻量应用服务器是轻量级服务器,轻量适合个人开发者或中小企业使用,清理使用简单、可视化运维更容易上手;ECS云服务器专业级服务器,适合企业级应用,通用型、计算型、大数据型、弹性裸金属服务器、GPU/FPGA/NPU异构计算

    2024年02月21日
    浏览(50)
  • 阿里云国际服务器ECS特性与优势

    阿里云国际服务器 的 ECS 作为一种安全、可靠、灵活、可扩展的云计算服务,不仅可以减少运行和维护,而且可以提高运行和维护效率,使用户关注核心业务的创新。 阿里云国际服务器ECS优势一:产品丰富 阿里云国际云服务器 ECS 可以提供业界丰富的产品序列,且支持主流计

    2024年02月01日
    浏览(41)
  • 阿里云服务器ECS有哪些功能特性?

    本文介绍云服务器ECS的功能特性,帮助您更好地了解和使用云服务器ECS。 实例是云上的虚拟计算服务器,内含vCPU、内存、操作系统、网络、磁盘等基础组件。您可以使用阿里云提供的控制台、API等管理工具创建和管理ECS实例,像使用本地服务器一样管理ECS实例的状态、应用

    2024年02月06日
    浏览(36)
  • 公有云——阿里云ECS服务器(IaaS)

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.了解云服务器的基础概念 1.云服务器的基础概念(云服务器选择) 2.云上概念(存储) (1)两者区别  3.云上概

    2024年02月05日
    浏览(44)
  • 阿里云产品试用系列-云服务器 ECS

    阿里云为个人开发者或者企业用户提供云产品的免费试用,本文主要描述ECS云服务器试用体验。 如上所示,在阿里云官方网站中,可使用云服务器ECS构建应用服务。 如上所示,在阿里云控制台中,可以显示成功定制免费使用阿里云ECS云服务器。 如上所示,使用阿里云提供登

    2024年02月08日
    浏览(48)
  • 阿里云服务器的tcp端口无法访问(云服务厂家问题?)

    最近一台阿里云服务器的一个端口61616无法访问,在服务器内用外网地ip发现无法访问,用内网ip访问是正常的,通过技术排查: 打开商家官网的,查看该实例的【安全组策略】:是放行的没变动,官网设置排除掉。 配置云服务器内部防火墙, 云主机内的防火墙虽然是 关闭

    2024年02月02日
    浏览(34)
  • 【服务器】搭建hMailServer 服务实现远程发送邮件

    hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工具即可实现远程发送邮件,不需要使用公网服务器,不需要域名,而且邮件账号名称可以自定义. 下面以windows 10系统为环境,介绍使用方法: 1. 安装hMailServer 进入官方下载:https://www.hmailserver.com/do

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包