📨

【備忘録】さくらのメールボックスとnodemailerを使ってSMTPでメールを送信する(2024年冬)

2024/12/12に公開

インターネット上にある情報が若干古く、そのままだと動かなくて思考錯誤したので備忘録として残しておきます。

結論

以下のように書けば送信できる

const nodemailer = require("nodemailer");

// SMTPサーバーの設定
let transporter = nodemailer.createTransport({
    host: "xxx.sakura.ne.jp", // 初期ドメイン
    port: 465,
    secure: true, 
    auth: {
        user: "noreply@xxx.sakura.ne.jp", // メールのユーザー名@初期ドメインにする
        pass: "xxxxxxxxxxxxx", // メールのユーザーパスワード
    },
    debug: true, // これをつけるとデバッグが便利
    logger: true, // これをつけないとデバッグログがstdoutに出ない
});

// メールの内容
let mailOptions = {
    from: '"Sender Name" <example@example.com>', // 独自ドメインで送信したい場合はここで指定する
    to: "customer@example.com", // 受信者のアドレス
    subject: "Hello", // 件名
    text: "Hello world?", // 本文
    html: "<b>Hello world?</b>", // HTML形式の本文
};

// メールを送信
transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }
    console.log("Message sent: %s", info.messageId);
    console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
});

どこにハマったか

TLS / SMTPS

  • 現在はSMTPSがさくらのメールボックスでも使用可能なので、465でも使える。
  • TLSを使う場合は secure を false にして、requireTLS を true にする

認証

  • インターネット上での情報だと、ユーザー名とパスワードだけでいけるとのことだったが、userに初期ドメインまで含めないと無理だった

Connection Timeout

  • 何度か試した後、Connection Timeoutが出て接続できなくなった
  • 調べた結果、試行回数が多すぎたためにグローバルIP単位でアクセス拒否されていた。ルーターを再起動しグローバルIPを再取得することで解決した

Discussion