AWS SES 和 JavaMailSender 实施期间出现错误

问题描述 投票:0回答:1

我正在尝试将 AWS SES 集成到我的 Spring Boot 应用程序中。我在我的 pom 中添加了以下依赖项,

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-ses</artifactId>
            <version>1.11.505</version>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.6.2</version>
        </dependency>

        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

我有以下抽象电子邮件上下文,它通过电子邮件上下文进行了扩展,

public abstract class AbstractEmailContext {
    private String from;
    private String to;
    private String subject;
    private String email;
    private String attachment;
    private String fromDisplayName;
    private String emailLanguage;
    private String displayName;
    private String templateLocation;
    private Map<String, Object> context;
    //getter and seter methods

    public AbstractEmailContext() {
        this.context = new HashMap<>();
    }
    public abstract <T> void init(T context);

    public abstract <T> void rinit(T context);

    public Object put(String key, Object value) {
        return key ==null ? null : this.context.put(key.intern(),value);
    }

    public String getTemplateLocation() {
        return templateLocation;
    }

    public void setTemplateLocation(String templateLocation) {
        this.templateLocation = templateLocation;
    }

    public void setContext(Map<String, Object> context) {
        this.context = context;
    }
}

public class AccountVerificationEmailContext extends AbstractEmailContext{

    private String token;

    @Override
    public <T> void init(T context){
        CCUser ccUser = (CCUser) context;
        put("name", ccUser.getName());
        setTemplateLocation("/confirm");
        setSubject("Complete your registration!");
        setFrom("[email protected]");
        setTo(ccUser.getEmail());
    }

    @Override
    public <T> void rinit(T context){
        CCUser ccUser = (CCUser) context;
        put("email", ccUser.getEmail());
        setTemplateLocation("/creset");
        setSubject("Change your Password!");
        setFrom("[email protected]");
        setTo(ccUser.getEmail());
    }

    public void setToken(String token){
        this.token = token;
        put("token", token);
    }

    public void buildVerificationUrl(final String baseUrl, final String token){
        final String url = UriComponentsBuilder.fromHttpUrl(baseUrl).path("/registration/verify").queryParam("token",token).toUriString();
        put("verificationURL",url);
    }

    public void buildResetUrl(final String baseUrl, final String token){
        final String url = UriComponentsBuilder.fromHttpUrl(baseUrl).path("/forgotpass/resetpass").queryParam("token",token).toUriString();
        put("verificationURL",url);
    }
}

当我从控制器类调用发送方法时,我收到以下错误,

java.lang.AbstractMethodError: Receiver class org.springframework.cloud.aws.mail.simplemail.SimpleEmailServiceJavaMailSender does not define or inherit an implementation of the resolved method 'abstract jakarta.mail.internet.MimeMessage createMimeMessage()' of interface org.springframework.mail.javamail.JavaMailSender.
    at com.xr.crosscheck.service.CCEmailServiceImpl.sendMail(CCEmailServiceImpl.java:25) ~[classes/:na]
    at com.xr.crosscheck.service.UserServiceImpl.sendRegistrationConfirmationEmail(UserServiceImpl.java:104) ~[classes/:na]
    at com.xr.crosscheck.service.UserServiceImpl.register(UserServiceImpl.java:68) ~[classes/:na]
    at com.xr.crosscheck.controller.RegistrationController.userRegistration(RegistrationController.java:52) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:262) ~[spring-web-6.1.2.jar:6.1.2]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[spring-web-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:917) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:829) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.2.jar:6.1.2]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.1.2.jar:6.1.2]

我的消息实现类如下,

@Autowired
    private JavaMailSender emailSender;
    @Autowired
    private SpringTemplateEngine templateEngine;

    @Override
    public void sendMail(AbstractEmailContext email) throws MessagingException{

        MimeMessage message = emailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());
        Context context = new Context();
        context.setVariables(email.getContext());
        String emailContent = templateEngine.process(email.getTemplateLocation(),context);

        mimeMessageHelper.setTo(email.getTo());
        mimeMessageHelper.setSubject(email.getSubject());
        mimeMessageHelper.setFrom(email.getFrom());
        mimeMessageHelper.setText(emailContent,true);
        emailSender.send(message);

    }
}

任何建议都会有帮助。

java spring-boot amazon-ses
1个回答
0
投票

我的猜测是,您正在使用 Spring Boot 的最新版本 (3.x)

spring-boot-starter-mail
。但与此同时,您正在使用非常旧的
spring-cloud-starter-aws
版本。
spring-cloud
版本与特定的 Spring Boot 版本相结合(在本例中可能是 2.1.x)。当您违反此版本兼容性范围时,您可能会遇到此类麻烦。在这种情况下,您的问题在 update jakarta.mail 1.6.5 to 2.0.1

得到了解释

提示:使用类似

mvn dependency:tree | grep mail
的内容来获得洞察力。

© www.soinside.com 2019 - 2024. All rights reserved.