咱們傳統使用的比較簡單的是 STMP 25端口收發郵件java
今天發現剛購買的阿里雲服務器不能做爲客戶端經過STMP 25端口發送郵件spring
開始在網上有說發現是JDK1.8的緣由,而後本身也把JDK1.8換到了JDK1.7 仍是不行,因此這裏排除了JDK的緣由。服務器
那麼問題來了,是否25端口不能鏈接適用喃?session
而後在終端輸入命令行 ,可測試25端口是否可鏈接。socket
telnet smtp.163.com 25
返回成功 說明你的服務器 是沒有封掉25端口的。上面的圖是我本身的電腦,固然能連通。ide
當換到服務器測試的時候 就會出現一隻鏈接不成功 測試
找了好久的問題,忽然在阿里雲客服社區發現一個帖子,當中有客服的解釋,固然我不是第一個遇到這個問題的人。阿里雲
那麼客服的解釋一下就說明的問題:好像是將25端口封掉了 時間是2016年9月底之後新購買的服務器。spa
那麼問題找到了 那就須要將25端口換到465端口 採用SSL協議傳輸郵件。.net
好了貼代碼時間到:
下面這段代碼是採用SSL協議發送郵件,可向多人單人發送郵件
public static boolean sslSend(MessageInfo msg1, EmailAccount emailAccount) throws AddressException, MessagingException, IOException{ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; // Get a Properties object Properties props = new Properties(); props.setProperty("mail.smtp.host", emailAccount.getPlace()); props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", "465"); props.setProperty("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.auth", "true"); final String username = emailAccount.getUsername(); final String password = emailAccount.getPassword(); Session session = Session.getDefaultInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); }}); Message msg = new MimeMessage(session); // 設置發件人和收件人 msg.setFrom(new InternetAddress(emailAccount.getUsername())); List<String> tos = msg1.getTo(); Address to[] = new InternetAddress[tos.size()]; for(int i=0;i<tos.size();i++){ to[i] = new InternetAddress(tos.get(i)); } // 多個收件人地址 msg.setRecipients(Message.RecipientType.TO, to); msg.setSubject(msg1.getSubject()); // 標題 msg.setText(msg1.getMsg());// 內容 msg.setSentDate(new Date()); Transport.send(msg); System.out.println("EmailUtil ssl協議郵件發送打印" +msg.toString()); return true; }
EmailAccout 字段
// 郵箱用戶 private String username; // 郵箱密碼 private String password; // 郵箱服務器 private String place;
MessageInfo 字段
@NameCN("發件人地址") private String from; @NameCN("收件人地址") private List<String> to; @NameCN("發送時間") private Date sendDate; @NameCN("郵件主題") private String subject; @NameCN("消息正文") private String msg;
將須要的信息,寫入這兩個Bean,傳入最上面的方法便可 使用。
下面是25端口 非SSl協議傳輸代碼塊
public void doSend(MessageInfo msg, EmailAccount emailAccount) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setFrom(msg.getFrom());// 設置發送者地址 List<String> tos = msg.getTo(); String to[] = new String[tos.size()]; tos.toArray(to); simpleMailMessage.setTo(to);// 設置接受者地址,可多個 simpleMailMessage.setSubject(msg.getSubject()); simpleMailMessage.setSentDate(msg.getSendDate()); simpleMailMessage.setText(msg.getMsg()); simpleMailMessage.setFrom(emailAccount.getUsername()); System.out.println("EmailUtil 郵件發送打印 1111" + simpleMailMessage.toString()); JavaMailSenderImpl s = new JavaMailSenderImpl(); s.setHost(emailAccount.getPlace()); // s.setPort(25); s.setUsername(emailAccount.getUsername()); s.setPassword(emailAccount.getPassword()); s.send(simpleMailMessage); }
這是參考的引入
import java.io.IOException; import java.security.Security; import java.util.Date; import java.util.List; import java.util.Properties; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import 項目包名.MessageInfo; import 項目包名.EmailAccount;
javamail是spring裏的javamail jar包。
OK當咱們使用465端口SSL協議的時候,順利的在服務器上發出郵件了。