java通过SMTP发送QQ邮件的完全步骤

在阿里云ECS上遇到SMTP.exmail.qq.com通过25端口发送邮件失败的问题,解决办法是改用465端口,并将协议切换为SSL。参照相关博客配置后,邮件发送成功。欢迎指出可能存在的问题,共同学习进步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阿里云 ECS smtp.exmail.qq.com 25 端口不通
所以下面设置的25端口是不行的,替换成465端口并修改协议为ssl即可
阿里云的参考这篇博客

http://blog.csdn.net/u013412790/article/details/72904038
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Calendar;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * @version V1.0
 * @Description: 发送邮件的工具类
 * @Modified By:Ming Created in  16:51 2017/2/6
 */
public class SendEmail {

    private static final Logger logger = LogManager.getLogger(SendEmail.class);

    private final static String smtpHost = "smtp.qq.com";//配置Email session对象
    private final static String messageType = "text/html;charset=UTF-8";//相应内容类型,编码类型
    private final static String subject = "iYo (社联网) 密码修改";//主题
    private final static String fromEmail = "272194539@qq.com";//发送邮件的邮箱
    private final static String password = "xxxxxxxxxxxxxxxx";//密码(口令)

    @SuppressWarnings("static-access")
    public boolean sendMessage(String to, int id) {
        try {
            String messageText = appendString(id);
            //第一步:配置javax.mail.Session对象
            Properties props = new Properties();   // 创建Properties 类用于记录邮箱的一些属性
            props.put("mail.smtp.host", smtpHost);  //此处填写SMTP服务器
            props.put("mail.smtp.starttls.enable", "true");//使用 STARTTLS安全连接
            props.put("mail.smtp.port", "25");             //google使用465或587端口
            props.put("mail.smtp.auth", "true");       // 表示SMTP发送邮件,必须进行身份验证
            props.put("mail.debug", "true");
            Session mailSession = Session.getInstance(props, new MyAuthenticator(fromEmail, password));//此处填写你的账号和口令(16位口令)

            //第二步:编写消息
            InternetAddress fromAddress = new InternetAddress(fromEmail);// 设置发件人的邮箱
            InternetAddress toAddress = new InternetAddress(to); // 设置收件人的邮箱
            MimeMessage message = new MimeMessage(mailSession);
            message.setFrom(fromAddress);
            message.addRecipient(RecipientType.TO, toAddress);
            message.setSentDate(Calendar.getInstance().getTime());
            message.setSubject(subject);   // 设置邮件标题
            message.setContent(messageText, messageType);// 设置邮件的内容体

            // 第三步:发送消息
            Transport transport = mailSession.getTransport("smtp");
            transport.connect(smtpHost, fromEmail, password);
            transport.send(message, message.getRecipients(RecipientType.TO)); // 发送邮件啦

            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            logger.error("邮件发送错误" + e.getMessage());
            return false;
        } catch (Exception e) {
            logger.error("邮件发送错误" + e.getMessage());
            return false;
        }
    }

    /**
     * @Author: Ming
     * @param: id  用户id
     * @Description: 添加发送的短信的信息
     * @Date: 17:12 2017/2/6
     */
    public static String appendString(int id) {
        int i;
        String t = "&nbsp";
        String messageText = "";

        for (i = 0; i < 4; i++) messageText += t;
        messageText += "xxxxxxxxx~<br/>";

        for (i = 0; i < 12; i++) messageText += t;
        messageText += "没关系,xxxxxxxxx<br/>";

        for (i = 0; i < 20; i++) messageText += t;
        messageText += "工作室地点:xxxxxxxxx~<br/><br/>";

        for (i = 0; i < 28; i++) messageText += t;
        messageText += "请点击:http://xxxxxxxxx";
        return messageText;
    }

}
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * @version V1.0
 * @Description: 构建授权信息,用于进行SMTP进行身份验证
 * @Modified By:Ming Created in  10:22 2017/2/7
 */
class MyAuthenticator extends Authenticator {
    private String userName="";
    private String password="";

    public MyAuthenticator(String userName,String password){
        this.userName=userName;
        this.password=password;
    }
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(userName, password);
    }
}

注意:

如果出现这个错误:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

这个是jdk导致的,jdk里面有一个jce的包,安全性机制导致的访问https会报错,官网上有替代的jar包,换掉就好了

目录 %JAVA_HOME%\jre\lib\security里的local_policy.jar,US_export_policy.jar

JDK7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

JDK8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

借鉴:

http://www.cnblogs.com/1995hxt/p/6185399.html

至此,邮件就应该能成功发出去啦。
本文是日常开发的随手记录,如有问题,请博内留言以帮助我改正和完善,一起努力,一起学习,一起进步!如果觉得有帮助,记得赞一个哟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值