如何通过Spring发送电子邮件

时间:2014-11-06 07:36:07

标签: spring javafx

在我的JavaFx项目中,我像这样注入我的控制器,这很好用:

@Configuration
public class AppFactory {

    @Bean
    public HomeController homeController() throws IOException {
        return (HomeController) loadController("/wakiliproject/Home.fxml");
    }

    FXMLLoader loader = null;

    protected Object loadController(String url) throws IOException {
        loader = new FXMLLoader(getClass().getResource(url));
        loader.load();
        return loader.getController();
    }
}

但是,对于非控制器类,我得到一个空指针异常,可能是因为该类永远不会被注入。比方说,我尝试从另一个非控制器类中调用非控制器类中的方法,如下所示:

通过Spring发送电子邮件,例如:

public class HomeController extends Application {

    @Autowired
    MailMail mailMail;


    // Send email here
    public void sendEmailMethod() {
        System.out.println("Here ----------------------------------------------------------------");
        mailMail.sendMail("olireylikesyou@gmail.com", "tryrevilo@yahoo.com", "Hello", "Subjecto");

    }

    // The other class methods

其他课程:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">  
    <property name="host" value="smtp.gmail.com" />  
    <property name="username" value="mygmailusername@gmail.com" />  
    <property name="password" value="gmailpassword" />  
    <property name="javaMailProperties">  
        <props>  
            <prop key="mail.smtp.auth">true</prop>  
        </props>  
    </property>  
</bean>

<bean id="mailMail" class="wakiliproject.ServerSide.EMail.MailMail">  
    <property name="mailSender" ref="mailSender" />  
</bean>

-

public class MailMail {

    private MailSender mailSender;

    public void setMailSender(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMail(String from, String to, String subject, String msg) {
        //creating message  
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(msg);
        //sending message  
        mailSender.send(message);
    }
}

stacktrace:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.mail.MailSendException: Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. k10sm2188955lae.42 - gsmtp
; message exceptions (1) are:
Failed message 1: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. k10sm2188955lae.42 - gsmtp

    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:448)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:308)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:297)
    at wakiliproject.ServerSide.EMail.MailMail.sendMail(MailMail.java:22)
    at wakiliproject.HomeController$HomeInit.homeInit(HomeController.java:618)
    at wakiliproject.HomeController$HomeInit.access$100(HomeController.java:613)
    at wakiliproject.HomeController.initHomeController(HomeController.java:319)
    at wakiliproject.WakiliProject.start(WakiliProject.java:34)
    at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    ... 1 more
Exception running application wakiliproject.WakiliProject
Java Result: 1

2 个答案:

答案 0 :(得分:6)

有一个类似的问题...让我尝试在我的application.properties中配置它(我正在使用spring注入JavaMailSender)

spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth = true;
spring.mail.properties.mail.socketFactory.port=587
spring.mail.properties.mail.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.socketFactory.fallback=false

以后我需要在测试期间为我的帐户启用更宽松的安全性:

“在https://www.google.com/settings/security/lesssecureapps更改您的设置,以便您的帐户不再受现代安全标准的保护”

或者我收到了身份验证错误。 我希望有帮助

答案 1 :(得分:3)