spring邮箱smtp协议解决阿里云发送不了25端口被封,使用ssl加密发送

添加邮件管理器

package cn.byang.common.utils.mail;

import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * @description: email配置
 * @author: yang
 * @create: 2021-11-20 19:42
 **/

public class MailTrustManager implements X509TrustManager  {
    @Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

    }

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}

yml配置

spring:
  mail:
#   设置邮箱主机(服务商)
    host: smtp.exmail.qq.com
#   设置发件人的邮箱
    username: xxx
#   设置密码,该处的密码是邮箱开启SMTP的授权码
    password: xxx
#   配置端口
    port: 465
#   使用协议
    protocol: smtp
#   字符编码
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          # 必须进行授权认证,它的目的就是阻止他人任意乱发邮件
          auth: true
          #SMTP加密方式:连接到一个TLS保护连接
          starttls:
            enable: true
          required: true
#          开启ssl
          ssl:
            enable: true
          socketFactory:
            port: 465
#			邮件工厂类路径
            class: cn.qpyl.common.utils.mail.MailSocketFactory

邮件工具类

package cn.byang.common.utils.mail;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;

@Component
public class MailUtils {

    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}")
    private String sendFrom;
    @Async("taskExecutor")
    public void sendSSLMail(String subject, String text, String to, List<File> files){
        try {
            //创建复杂邮件对象
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            //发送复杂邮件的工具类
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
            helper.setFrom(sendFrom);
            helper.setSubject(subject);
            helper.setText(text,true);
            //添加附件
            if(files != null && files.size() > 0){
                files.forEach(file -> {
                    try {
                        helper.addAttachment(file.getName(), file);
                    } catch (MessagingException e) {
                        e.printStackTrace();
                    }
                });
            }
            //收件人
            helper.setTo(to);
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

邮件工厂

package cn.qpyl.common.utils.mail;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @program: b2b-deli-purchase
 * @description: 邮箱ssl配置
 * @author: Mr.cy
 * @create: 2020-11-13 19:40
 **/

public class MailSocketFactory extends SSLSocketFactory {
    private SSLSocketFactory factory;

    public MailSocketFactory() {
        try {
            SSLContext sslcontext = SSLContext.getInstance("ssl");
            sslcontext.init(null, new TrustManager[] { new MailTrustManager() }, null);
            factory = sslcontext.getSocketFactory();
        } catch (Exception ex) {
            // ignore
        }
    }

    public static SocketFactory getDefault() {
        return new MailSocketFactory();
    }

    @Override
    public Socket createSocket() throws IOException {
        return factory.createSocket();
    }

    @Override
    public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
        return factory.createSocket(socket, s, i, flag);
    }

    @Override
    public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
        return factory.createSocket(inaddr, i, inaddr1, j);
    }

    @Override
    public Socket createSocket(InetAddress inaddr, int i) throws IOException {
        return factory.createSocket(inaddr, i);
    }

    @Override
    public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
        return factory.createSocket(s, i, inaddr, j);
    }

    @Override
    public Socket createSocket(String s, int i) throws IOException {
        return factory.createSocket(s, i);
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return factory.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return factory.getSupportedCipherSuites();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Kafka发送华为云ROMA Connect Kafka消息可以按照以下步骤进行: 1. 首先,确保已经在项目中引入了Spring Kafka的依赖。可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.0</version> </dependency> ``` 2. 在Spring Boot的配置文件中,配置Kafka的连接信息。可以在application.properties或application.yml文件中添加以下配置: ```properties spring.kafka.bootstrap-servers=<kafka-bootstrap-servers> spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer ``` 其中,`<kafka-bootstrap-servers>`是华为云ROMA Connect Kafka的bootstrap servers地址。 3. 创建一个KafkaProducer的Bean,用于发送消息。可以在Spring Boot的配置类中添加以下代码: ```java import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.serialization.StringSerializer; import import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.core.DefaultKafkaProducerFactory; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.ProducerFactory; import java.util.HashMap; import java.util.Map; @Configuration public class KafkaConfig { @Bean public ProducerFactory<String, String> producerFactory() { Map<String, Object> configProps = new HashMap<>(); configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "<kafka-bootstrap-servers>"); configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); return new DefaultKafkaProducerFactory<>(configProps); } @Bean public KafkaTemplate<String, String> kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); } } ``` 其中,`<kafka-bootstrap-servers>`是华为云ROMA Connect Kafka的bootstrap servers地址。 4. 在需要发送消息的地方,注入KafkaTemplate,并使用发送消息。可以在任何Spring管理的Bean中注入KafkaTemplate,并调用其`send()`方法发送消息。以下是一个示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class KafkaMessageSender { private final KafkaTemplate<String, String> kafkaTemplate; @Autowired public KafkaMessageSender(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } } ``` 在上述示例中,`KafkaMessageSender`类注入了`KafkaTemplate`,并提供了一个`sendMessage()`方法用于发送消息。 这样,你就可以使用Spring Kafka发送华为云ROMA Connect Kafka消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值