???發(fā)送郵件需要通過(guò)驗(yàn)證,我們需要建立一個(gè)帶有實(shí)現(xiàn)了Authenticator的Session.我們應(yīng)該了解,在用Java編寫(xiě)JavaMail時(shí)是需要使用的驗(yàn)證的,但是,在Spring中沒(méi)有提供注入驗(yàn)證實(shí)現(xiàn)的功能(即注入Authenticator的實(shí)現(xiàn)).但是我們可以用以下方式加以實(shí)現(xiàn),下面就以gmail郵件為例說(shuō)明:
???在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>
實(shí)現(xiàn)我們自己的驗(yàn)證實(shí)現(xiàn)
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(); } }
???對(duì)于gmail端口的設(shè)置可以參考:http://mail.google.com/support/bin/a...y?answer=13287,個(gè)人認(rèn)為yahoo和 gmail 都希望我們使用驗(yàn)證,并且我們可以為每個(gè)郵件服務(wù)器設(shè)置不同的端口.如果沒(méi)有采用驗(yàn)證,與gmail的連接將會(huì)拋出一個(gè)沒(méi)有驗(yàn)證信息的異常!