我正在尝试将 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);
}
}
任何建议都会有帮助。
我的猜测是,您正在使用 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
的内容来获得洞察力。