zoukankan      html  css  js  c++  java
  • 阿里云服务器 通过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协议的时候,顺利的在服务器上发出邮件了。

  • 相关阅读:
    特征选取1-from sklearn.feature_selection import SelectKBest
    使用K-S检验一个数列是否服从正态分布、两个数列是否服从相同的分布
    风控8-收码平台
    风控7-同盾设备指纹
    互联网黑产剖析_虚假号码
    风控3_iv算法详细解释
    woe_iv原理和python代码建模
    逾期30天和60天的回款概率
    (剑指Offer)面试题15:链表中倒数第k个结点
    (剑指Offer)面试题14:调整数组顺序使奇数位于偶数前面
  • 原文地址:https://www.cnblogs.com/loveincode/p/6476358.html
Copyright © 2011-2022 走看看