javamail发邮件前必须配好smtp服务器地址、端口、认证方式;qq邮箱用smtp.qq.com:587+starttls,163用smtp.163.com:465+ssl,gmail需应用专用密码+smtp.gmail.com:587。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

用JavaMail发邮件前必须配好的三样东西
要在Java项目里稳定发送邮件,你得先确认SMTP服务器地址、端口、认证方式这三项配置是否准确——少一个或写错一个,Transport.send()就会直接抛MessagingException,连调试日志都看不出具体哪步断了。
QQ邮箱用 smtp.qq.com:587 + STARTTLS;163邮箱用 smtp.163.com:465 + SSL;Gmail已停用普通密码登录,必须用应用专用密码+smtp.gmail.com:587。别抄网上旧教程填25端口,现在绝大多数服务商已强制加密。
授权码不是邮箱登录密码。QQ/163必须去网页端「设置→账户→开启POP3/SMTP服务」后生成16位授权码,粘贴进代码的password字段——【硬编码明文写密码会直接导致邮箱被封】。
Maven依赖怎么加才不踩坑
用Jakarta EE 9+(Java 11及以上)项目,必须引入jakarta.mail-api和jakarta.mail,不能混用javax.mail旧包:
如果用的是Spring Boot 3.x,默认已集成jakarta.mail,不用额外引——但要检查application.properties里有没有误配成spring.mail.host=smtp.163.com这种旧写法,新版本必须用spring.mail.smtp.host。
五步写出能跑通的发送逻辑
第一步:创建带认证的Session对象,用Properties显式指定所有关键参数,不要依赖System.getProperties()——后者可能被其他框架污染。
第二步:new MimeMessage(session),立刻调用message.setFrom(new InternetAddress(from)),注意from必须和SMTP登录账号完全一致,否则网易系邮箱会拒收。
第三步:用InternetAddress.parse(to)解析收件人,支持英文逗号分隔多个地址;若需抄送,追加message.addRecipient(Message.RecipientType.CC, new InternetAddress(cc))。
第四步:区分内容类型。纯文本用message.setText("正文");HTML邮件必须用message.setContent("
你好
", "text/html;charset=UTF-8")——【漏写charset=UTF-8会导致中文变问号】。第五步:Transport.send(message)。这一步无返回值,成功即静默结束;失败必抛MessagingException,catch块里必须打印mex.getMessage()而非只printStackTrace(),否则SSL握手失败时你看不到“PKIX path building failed”这种关键提示。
通义灵码能帮你写什么,不能帮你写什么
它能根据注释自动生成带完整try-catch的sendEmail(String to, String subject, String content)方法骨架,包括Session配置、MimeMessage组装、异常捕获结构。
它不能自动识别你用的是QQ还是163邮箱——你得在注释里写清楚“用QQ邮箱smtp.qq.com发测试邮件”,否则它默认按Gmail配置生成,端口写成465却没开SSL,运行就报连接超时。
它不会提醒你删掉测试代码里的硬编码邮箱密码。你必须自己把password字段替换成System.getenv("MAIL_PASSWORD")或从配置中心读取——【提交前不清理,代码一推GitLab,邮箱立刻被盗】。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











