阿里雲服務器 通過JavaMail發送郵箱STMP問題 25端口被禁用 使用SSL協議465端口


1 問題描述

我們傳統使用的比較簡單的是 STMP 25端口收發郵件

今天發現剛購買的阿里雲服務器不能作為客戶端通過STMP 25端口發送郵件

開始在網上有說發現是JDK1.8的原因,然后自己也把JDK1.8換到了JDK1.7 還是不行,所以這里排除了JDK的原因。

那么問題來了,是否25端口不能連接適用喃?

然后在終端輸入命令行 ,可測試25端口是否可連接。

telnet smtp.163.com 25 

 

返回成功 說明你的服務器 是沒有封掉25端口的。上面的圖是我自己的電腦,當然能連通。

當換到服務器測試的時候 就會出現一只連接不成功 

找了很久的問題,突然在阿里雲客服社區發現一個帖子,當中有客服的解釋,當然我不是第一個遇到這個問題的人。

那么客服的解釋一下就說明的問題:好像是將25端口封掉了 時間是2016年9月底以后新購買的服務器。

2 問題解決

那么問題找到了 那就需要將25端口換到465端口 采用SSL協議傳輸郵件。

好了貼代碼時間到:

下面這段代碼是采用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協議的時候,順利的在服務器上發出郵件了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM