???發送郵件需要通過驗證,我們需要建立一個帶有實現了Authenticator的Session.我們應該了解,在用Java編寫JavaMail時是需要使用的驗證的,但是,在Spring中沒有提供注入驗證實現的功能(即注入Authenticator的實現).但是我們可以用以下方式加以實現,下面就以gmail郵件為例說明:
???在Spring中的配置信息如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- our Authenticator implementation --> <bean id="smtpAuthenticator" class="forums.mailtest.SmtpAuthenticator"> <constructor-arg value="yourname@gmail.com" /> <constructor-arg value="password" /> </bean> <!-- now setup an authenticated session --> <bean id="mailSession" class="javax.mail.Session" factory-method="getInstance"> <constructor-arg> <props> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.socketFactory.port">465</prop> <prop key="mail.smtp.socketFactory.class"> javax.net.ssl.SSLSocketFactory </prop> <prop key="mail.smtp.socketFactory.fallback"> false </prop> </props> </constructor-arg> <constructor-arg ref="smtpAuthenticator" /> </bean> <!-- and configure the MailSender with the authenticated session --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.gmail.com" /> <property name="session" ref="mailSession" /> </bean> <!-- this is a template message that we can pre-load with default state --> <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="yourname@gmail.com" /> <property name="subject" value="Testing" /> </bean> <bean id="mailTest" class="forums.mailtest.MailTest"> <constructor-arg ref="mailSender" /> <constructor-arg ref="templateMessage" /> </bean> </beans>
實現我們自己的驗證實現
package forums.mailtest; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class SmtpAuthenticator extends Authenticator { private String username; private String password; public SmtpAuthenticator(String username, String password) { super(); this.username = username; this.password = password; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }
package forums.mailtest; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class MailTest { private MailSender mailSender; private SimpleMailMessage templateMessage; public MailTest(MailSender mailSender, SimpleMailMessage templateMessage) { super(); this.mailSender = mailSender; this.templateMessage = templateMessage; } public void sendMeMail() { SimpleMailMessage msg = new SimpleMailMessage(templateMessage); msg.setTo("test@example.com"); msg.setText("This is a test.\nGo Spring!\n"); try { this.mailSender.send(msg); } catch (MailException e) { System.err.println("Didn't work."); e.printStackTrace(); } } public static final void main(String[] args) { ApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] { "forums/mailtest/application-config.xml" }); MailTest tester = (MailTest) appCtx.getBean("mailTest"); tester.sendMeMail(); } }
???對于gmail端口的設置可以參考:http://mail.google.com/support/bin/a...y?answer=13287,個人認為yahoo和 gmail 都希望我們使用驗證,并且我們可以為每個郵件服務器設置不同的端口.如果沒有采用驗證,與gmail的連接將會拋出一個沒有驗證信息的異常!