Linux配置465端口发送邮件,并将html表格发送到邮件

今天在Springboot项目中遇到一个问题,JAVA后台代码在windows下发送邮件正常,打包部署到linux服务器上发送邮件一直失败,咨询了下阿里的客服,原来是发送邮件的25端口被禁用,所以邮件发送失败。

解决办法:

邮件发送部署在云服务器上时,不要使用默认的端口(25),一般为了安全云服务器默认是禁掉的,但是可以配置解禁,不过不推荐这样做。

改变发送邮件Port,本文以465端口号为例,大家可以根据实际情况,配置使用。

使用465端口或者是其他端口,需要去阿里后台配置规则添加开发相应端口

1.配置springboot配置文件

spring:
  mail:
    host: smtp.163.com   //根据邮箱类别设置
    username: 邮箱
    password: 授权码,不是邮箱密码
    properties:
      mail:
        smtp:
          auth: true
          timeout: 25000
          ssl.enable: true
          socketFactory.class: javax.net.ssl.SSLSocketFactory
          starttls.enable: true
          socketFactory.port: 465 
          port: 465    

2.JAVA后台


	@Autowired
	private JavaMailSender sender;

	@Value("${spring.mail.username}")
	private String from;
	@Value("${spring.mail.password}")
	private String psw;
	@Value("${spring.mail.host}")
	private String host;


/**
	 * 使用加密的方式,利用465端口进行传输邮件,开启ssl
	 * user对象为接收邮件的一些信息
	 */
	public boolean sendMail(SysUser user) {
		try {
			Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
			final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
			// 设置邮件会话参数
			Properties props = new Properties();
			// 邮箱的发送服务器地址
			props.setProperty("mail.smtp.host", host);
			props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
			props.setProperty("mail.smtp.socketFactory.fallback", "false");
			// 邮箱发送服务器端口,这里设置为465端口
			props.setProperty("mail.smtp.port", "465");
			props.setProperty("mail.smtp.socketFactory.port", "465");
			props.put("mail.smtp.auth", "true");
			final String username = from;//这里就是配置文件中定义的用户名
			final String password = psw;
			// 获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
			Session session = Session.getDefaultInstance(props, new Authenticator() {
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(username, password);
				}
			});
			// 通过会话,得到一个邮件,用于发送
			Message msg = new MimeMessage(session);
			// 设置发件人
			msg.setFrom(new InternetAddress(from));
			// 设置收件人,to为收件人,cc为抄送,bcc为密送
			msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(user.getUsername(), false));
			msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(user.getUsername(), false));
			msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(user.getUsername(), false));
			msg.setSubject("xx邮件");
			// 设置邮件消息
			msg.setText("恭喜你,此邮件。。。。。。。。不需要回复");//这里也可以定义跳转链接
			// 设置发送的日期
			msg.setSentDate(new Date());

			// 调用Transport的send方法去发送邮件
			Transport.send(msg);

		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;

	}

3.本文使用的服务器为阿里云服务器,一般自己使用的端口号需要在网络安全配置中去开启使用的端口号,并把它加入到防火墙中,经过以上步骤,基本上就可以解决本地可以发送而linux服务器无法发送邮件的问题了。

4.如果想抄送多个收件人可不仅是将抄送人添加到集合中,然后以for循环,这样是行不通的,可以采用下面这样的方法,这样在邮件发送时,即可将邮件同步抄送到email[ ].

InternetAddress[] addressesCc = null;
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("111@qq.com", false));
String[] email = { "222@qq.com", "333@qq.com", "444@qq.com", "555@qq.com","666@qq.com"};
int count = email.length;
addressesCc = new InternetAddress[count];
for (int i = 0; i < email.length; i++) {
	addressesCc[i] = new InternetAddress(email[i]);//将邮箱放入地址数组中
}
msg.setRecipients(Message.RecipientType.CC, addressesCc);

5.如果想将后台查询的数据以表格或其它Html样式发送到邮箱该如何处理呢?其实也很简单,直接将content内容定义为html样式输出即可

				// 通过会话,得到一个邮件,用于发送
				Message msg = new MimeMessage(session);
				// 设置发件人
				msg.setFrom(new InternetAddress(from));
				// 设置收件人,to为收件人,cc为抄送,bcc为密送
				InternetAddress[] addressesCc = null;

				msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("xxx@qq.comk", false));
				String[] email = { "xxx@qq.com", "xxx@qq.com", "xxx@qq.com"};
				int count = email.length;
				addressesCc = new InternetAddress[count];
				for (int i = 0; i < email.length; i++) {
					addressesCc[i] = new InternetAddress(email[i]);
				}
				msg.setRecipients(Message.RecipientType.CC, addressesCc);
				msg.setSubject("xxxx系统");
				// 设置html内容
				Multipart mainPart = new MimeMultipart();
				// 创建一个包含HTML内容的MimeBodyPart
				BodyPart html = new MimeBodyPart();
				// 设置邮件消息
				StringBuilder content = new StringBuilder(
						"<html><head></head><body><h2>官方通知邮件,请勿回复此邮件!</h2>\"\r\n"
								+ "<h3>尊敬的用户您好,xxxxxx,请及时登录系统处理。 如有其它问题请及时沟通反馈</h3><br>\"\r\n");
				content.append(
						"<table border=\"5\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:18px;\">");
				content.append(
						"<tr style=\\\"background-color: #428BCA; color:#ffffff\\\"><th>文件编号</th><th>一级菜单</th><th>二级菜单</th><th>三级菜单</th><th>四级菜单</th><th>五级菜单</th><th>文件名</th><th>过期时间</th></tr>");
				for (WisdomFile data : list) {
					content.append("<tr>");
					content.append("<td>" + data.getFileNo() + "</td>"); // 第一列
					content.append("<td>" + data.getPrimaryMenu() + "</td>"); // 第二列
					content.append("<td>" + data.getSecondaryMenu() + "</td>"); // 第三列
					content.append("<td>" + data.getThreeLevel() + "</td>");
					content.append("<td>" + data.getFourLevel() + "</td>");
					content.append("<td>" + data.getFiveLevel() + "</td>");
					content.append("<td>" + data.getFileName() + "</td>");
					content.append("<td>" + data.getExpirationDate() + "</td>");
					content.append("</tr>");
				}
				content.append("</table>");
				content.append("<h3>描述xxxxxxxxx</h3>");
				content.append("</body></html>");

				// 设置发送的日期
				msg.setSentDate(new Date());
				html.setContent(content.toString(), "text/html; charset=utf-8");
				mainPart.addBodyPart(html);
				msg.setContent(mainPart);
				msg.saveChanges();
				// 调用Transport的send方法去发送邮件
				Transport.send(msg);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值