首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaMail 實戰:Spring 整合發送帳號啟動信完整流程

     編輯:Java 相關知識

業務場景

使用者註冊 → 系統產生啟動碼 → 發送 HTML 郵件含啟動連結 → 使用者點擊連結 → 驗證碼比對 → 啟用帳號。

核心工具類:MailUtils

package cn.itcast.shop.utils;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class MailUtils {
    public static void sendMail(String to, String code) {
        // 1. Session 設定
        Properties props = new Properties();
        props.setProperty("mail.host", "localhost"); // 易郵郵件伺服器
        props.setProperty("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("service@azz.com", "111");
            }
        });

        // 2. 建立 MimeMessage
        MimeMessage message = new MimeMessage(session);
        try {
            // 寄件者
            message.setFrom(new InternetAddress("service@azz.com"));
            // 收件者
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            // 主旨
            message.setSubject("來自周洲商城的官方啟動郵件");
            // HTML 內容
            String url = "https://192.168.21.114:8080/shop/user_active.action?code=" + code;
            String content = "<h1>AZZ商城官方啟動郵件!點下方連結完成啟動操作!</h1>" +
                             "<h3><a href='" + url + "'>" + url + "</a></h3>";
            message.setContent(content, "text/html;charset=UTF-8");

            // 3. 發送
            Transport.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

Service 層整合

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;

    public void register(User user) {
        // 1. 狀態 0 = 未啟用
        user.setState(0);
        // 2. 產生唯一啟動碼
        String code = UUIDUtils.getUUID() + UUIDUtils.getUUID();
        user.setCode(code);
        // 3. 存入資料庫
        userDao.save(user);
        // 4. 非同步發送郵件(建議用 @Async 或 MQ)
        MailUtils.sendMail(user.getEmail(), code);
    }

    public User findByCode(String code) {
        return userDao.findByCode(code);
    }

    public void activate(User user) {
        user.setState(1); // 已啟用
        userDao.update(user);
    }
}

Controller 處理啟動請求

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/user_active.action")
    public String active(@RequestParam String code) {
        User user = userService.findByCode(code);
        if (user != null) {
            userService.activate(user);
            return "activeSuccess"; // 跳轉成功頁
        }
        return "activeFail"; // 失敗頁
    }
}

關鍵技術點總結

環節關鍵點
啟動碼生成UUID 雙重拼接,極低碰撞機率;或用 JWT 簽名 Token
郵件內容HTML 格式 + 絕對路徑連結,避免相對路徑在郵件客戶端失效
SMTP 設定本地易郵伺服器需啟用 SMTP、設定帳號密碼、開放連接埠
非同步發送註冊主流程不阻塞,使用 @Async、CompletableFuture 或訊息佇列
防重複發送資料庫唯一索引 (email) + 狀態機制,避免重複註冊發信
安全性啟動碼一次性、時效性(如 24 小時過期)、HTTPS 連結

生產環境建議升級

  • 改用 Spring Boot Mail Starter + JavaMailSender 簡化配置
  • 郵件模板引擎:Thymeleaf / FreeMarker 分離內容與程式碼
  • 發送失敗重試:Spring Retry + 指數退避
  • 大量發送:接入 Amazon SES、SendGrid 等專業郵件服務
  • 監控指標:發送成功率、退信率、延遲時間

結語

JavaMail 配合 Spring 實現註冊啟動信是經典入門案例。掌握 MimeMessage HTML 內容建構、SMTP 認證設定、非同步發送與啟動碼安全設計,即可構建可靠的用戶驗證通道。實務中務必重視「非同步解耦」與「模板化維護」,為後續擴充奠基。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved