tencent cloud

Simple Email Service

製品の説明
製品概要
製品の機能
製品の優位性
ユースケース
仕様明細
購入ガイド
料金説明
クイックスタート
メール設定
メール送信
信頼度レベルの説明
コンソールガイド
メール設定
メール送信
データ統計
SMTPドキュメント
SMTPメール送信ガイド
SMTPサービスアドレス
Java呼び出し例
Go呼び出し例
PHP呼び出し例
添付ファイル付きメールの送信
エラーコード
Webhookドキュメント
メール通知イベント
メール送信制限
添付ファイルタイプ
よくあるご質問
スタートに関するご質問
課金関連問題
送信制限に関するご質問
送信機能に関するご質問
ドメイン名に関するご質問
テンプレートに関するご質問
ID認証と設定に関するご質問
専用IPに関するご質問
配信に関するご質問
APIの使用に関するご質問
コールバックに関するご質問
迷惑メールフォルダに関するご質問
セキュリティに関するご質問
ちゅういじこう
その他のご質問
お問い合わせ
ドキュメントSimple Email ServiceSMTPドキュメント添付ファイル付きメールの送信

添付ファイル付きメールの送信

PDF
フォーカスモード
フォントサイズ
最終更新日: 2026-01-16 10:44:02
SMTPのメソッドで添付ファイル付きメールを送信する方法、すなわちMIME形式のメールコンテンツを作成します。

メールMIME形式

プロトコルの詳細については、MIMEプロトコルをご参照ください。
説明:
MIMEメッセージは、メッセージヘッダーとメッセージボディの2つの主なパートから構成されています。これらは、メールヘッダーメールボディと呼ばれます。

メールヘッダー

説明:
各情報はドメインと呼ばれ、ドメイン名の後に付く「:」と情報内容で構成されています。1行にすることも、複数行になる長めのものにすることもできます。
ドメインの最初の行は、「トップ」に書き込む必要があります。すなわち、左側に空白文字(スペースやタブ)を入れないようにします。
継続行の先頭は、空白文字で始まる必要があります。空白文字はメッセージ固有のものではありません(デコード時にフィルタリングします)。
メールヘッダーに空白行を入れることはできません。メールの中にはメールクライアントソフトで認識されず、1行目が空白行のため、元のコードが表示される場合があります。
例:
コンテンツ
事例
Date
Mon, 29 Jun 2009 18:39:03 +0800
From
abc@123.com
To
abc1@123.com
BCC
abc3@123.com
Subject
test
Message-ID
123@123.com
Mime-Version
1.0
ドメイン名
意味
Bcc
Bccアドレス
Cc
Ccアドレス
Content-Transfer-Encoding
コンテンツ転送エンコード
Content-Type
コンテンツのタイプ
Date
日付と時刻
Delivered-To
送信アドレス
From
送信者アドレス
Message-ID
メッセージID
MIME-Version
MIMEバージョン
Received
伝送パス
Reply-To
返信アドレス
Return-Path
返信アドレス
Subject
件名
To
受信者アドレス

メールボディ

ドメイン名
意味
Content-ID
コンテンツID
Content-Transfer-Encoding
コンテンツ転送エンコード
Content-Location
コンテンツの位置(パス)
Content-Base
コンテンツベース
Content-Disposition
コンテンツの配置方法
Content-Type
コンテンツタイプ
ドメインの中には値の他にパラメータを持つものがあります。値とパラメータ、パラメータとパラメータの間は「;」で区切ります。パラメータ名とパラメータ値は「=」で区切ります。
メールボディにはメールコンテンツが含まれ、そのタイプはメールヘッダーのContent-Typeドメインによって示されます。
説明:
一般的なシンプルタイプには、以下があります。
text/plain(プレーンテキスト)
text/html(ハイパーテキスト)
multipartタイプは、MIMEメールの基本です。メールボディは複数のフィールドに分割されており、各フィールドにはヘッダーとボディという2つの部分があります。これらも空白行で区切られています。
一般的なmultipartタイプには、以下3タイプあります。
multipart/mixed
multipart/related
multipart/alternative
上記の名前から、これらの各タイプの意味と用途がわかります。これらの階層的な関係をまとめると下図のようになります。



メールに添付ファイルを追加する場合は、multipart/mixedフィールドを定義する必要があります。埋め込みリソースがある場合は、少なくともmultipart/relatedフィールドを定義する必要があります。プレーンテキストとハイパーテキストが共存する場合、少なくとも multipart/alternativeフィールドを定義する必要があります。
説明:
添付ファイルの数は10件以下、個々の添付ファイルのサイズは4M以下、添付ファイルの合計サイズは8M以下とします。詳細については、データ構造をご参照ください。

Go コードサンプル

package main
import (
"bytes"
"crypto/tls"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"mime"
"net"
"net/smtp"
"time"
)

// Test465Attachment for port 465
func Test465Attachment() error {
boundary := "GoBoundary"
host := "sg-smtp.qcloudmail.com"
port := 465
email := "abc@cd.com"
password := "***"
toEmail := "test@test123.com"
header := make(map[string]string)
header["From"] = "test " + "<" + email + ">"
header["To"] = toEmail
header["Subject"] = "Test465Attachment"
header["Content-Type"] = "multipart/mixed;boundary=" + boundary
//このフィールドは現在使用されておらず、デフォルトで1.0が渡されます
header["Mime-Version"] = "1.0"
//このフィールドは現在使用されていません
header["Date"] = time.Now().String()
bodyHtml := "<!DOCTYPE html>\\n<html>\\n<head>\\n<meta charset=\\"utf-8\\">\\n<title>hello world</title>\\n</head>\\n<body>\\n " +
"<h1>私の最初の件名</h1>\\n <p>私の最初の段落。</p>\\n</body>\\n</html>"
message := ""
for k, v := range header {
message += fmt.Sprintf("%s: %s\\r\\n", k, v)
}
buffer := bytes.NewBuffer(nil)
buffer.WriteString(message)
contentType := "Content-Type: text/html" + "; charset=UTF-8"
body := "\\r\\n--" + boundary + "\\r\\n"
body += contentType + "\\r\\n"
body += "Content-Transfer-Encoding: base64\\r\\n"
body += "\\r\\n" + base64.StdEncoding.EncodeToString([]byte(bodyHtml)) + "\\r\\n"
buffer.WriteString(body)

attachment := "\\r\\n--" + boundary + "\\r\\n"
attachment += "Content-Transfer-Encoding:base64\\r\\n"
attachment += "Content-Disposition:attachment\\r\\n"
attachment += "Content-Type:" + "application/octet-stream" + ";name=\\"" + mime.BEncoding.Encode("UTF-8",
"./go.mod") + "\\"\\r\\n"
buffer.WriteString(attachment)
writeFile(buffer, "./go.mod")
//複数の添付ファイルをまとめます。添付ファイルは最大10件とし、添付ファイル1件につき5M以下、全添付ファイルの合計は8~9M以下とします。メッセージボディが大きすぎるとEOFを返します
attachment1 := "\\r\\n--" + boundary + "\\r\\n"
attachment1 += "Content-Transfer-Encoding:base64\\r\\n"
attachment1 += "Content-Disposition:attachment\\r\\n"
attachment1 += "Content-Type:" + "application/octet-stream" + ";name=\\"" + mime.BEncoding.Encode("UTF-8",
"./bbbb.txt") + "\\"\\r\\n"
buffer.WriteString(attachment1)
writeFile(buffer, "./bbbb.txt")
defer func() {
if err := recover(); err != nil {
log.Fatalln(err)
}
}()

buffer.WriteString("\\r\\n--" + boundary + "--")
message += "\\r\\n" + body
auth := smtp.PlainAuth(
"",
email,
password,
host,
)
err := SendMailWithTLS(
fmt.Sprintf("%s:%d", host, port),
auth,
email,
[]string{toEmail},
buffer.Bytes(),
)
if err != nil {
fmt.Println("Send email error:", err)
} else {
fmt.Println("Send mail success!")
}
return err
}

// Dial return a smtp client
func Dial(addr string) (*smtp.Client, error) {
conn, err := tls.Dial("tcp", addr, nil)
if err != nil {
log.Println("tls.Dial Error:", err)
return nil, err
}

host, _, _ := net.SplitHostPort(addr)
return smtp.NewClient(conn, host)
}

// SendMailWithTLS send email with tls
func SendMailWithTLS(addr string, auth smtp.Auth, from string,
to []string, msg []byte) (err error) {
//create smtp client
c, err := Dial(addr)
if err != nil {
log.Println("Create smtp client error:", err)
return err
}
defer c.Close()
if auth != nil {
if ok, _ := c.Extension("AUTH"); ok {
if err = c.Auth(auth); err != nil {
log.Println("Error during AUTH", err)
return err
}
}
}
if err = c.Mail(from); err != nil {
return err
}
for _, addr := range to {
if err = c.Rcpt(addr); err != nil {
return err
}
}
w, err := c.Data()
if err != nil {
return err
}
_, err = w.Write(msg)
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
return c.Quit()
}

// writeFile read file to buffer
func writeFile(buffer *bytes.Buffer, fileName string) {
file, err := ioutil.ReadFile(fileName)
if err != nil {
panic(err.Error())
}
payload := make([]byte, base64.StdEncoding.EncodedLen(len(file)))
base64.StdEncoding.Encode(payload, file)
buffer.WriteString("\\r\\n")
for index, line := 0, len(payload); index < line; index++ {
buffer.WriteByte(payload[index])
if (index+1)%76 == 0 {
buffer.WriteString("\\r\\n")
}
}
}

func main() {
Test465Attachment()
}


Python コードサンプル

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.utils import formatdate
from email.header import Header
import ssl

def send_email_with_attachments():
# メールサーバーの設定、Go コードサンプル
host = "smtp.qcloudmail.com" # サイトごとに異なるアクセスドメイン名を選択してください
port = 465
email = "abc@cd.com" # コンソールで登録した SMTP ユーザー名
password = "****" # コンソールで登録した SMTP パスワード
to_email = "test@test123.com"
# MIME メッセージを作成
msg = MIMEMultipart('mixed')
msg['From'] = f"test <{email}>"
msg['To'] = to_email
msg['Subject'] = "Test465Attachment"
msg['Date'] = formatdate(localtime=True)
msg['Mime-Version'] = "1.0"
# HTML 本文の内容
html_body = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"><title>hello world</title>
</head>
<body>
<h1>最初の見出し</h1>
<p>最初の段落です。</p>
</body>
</html>
"""
# HTML 本文部分を追加
html_part = MIMEText(html_body, 'html', 'utf-8')
msg.attach(html_part)
# 添付ファイルを追加
attachments = ["./中国語名.txt"]
for attachment_path in attachments:
if os.path.exists(attachment_path):
try:
# 添付ファイルを読み込む
with open(attachment_path, 'rb') as file:
attachment_data = file.read()
# MIMEBase オブジェクトを作成
attachment_part = MIMEBase('application', 'octet-stream')
attachment_part.set_payload(attachment_data)
# base64 にエンコード
encoders.encode_base64(attachment_part)
# 添付ファイルのヘッダー情報を設定
filename = os.path.basename(attachment_path)
encoded_filename = Header(filename, 'utf-8').encode()
attachment_part.add_header(
'Content-Disposition',
f'attachment; filename="{encoded_filename}"'
)
msg.attach(attachment_part)
print(f"添付ファイルの追加に成功しました: {filename}")
except Exception as e:
print(f"添付ファイル {attachment_path} の追加中にエラーが発生しました: {e}")
else:
print(f"添付ファイルが存在しません: {attachment_path}")
try:
# SSL コンテキストを作成
context = ssl.create_default_context()
# SMTP サーバーに接続してメールを送信
with smtplib.SMTP_SSL(host, port, context=context) as server:
server.login(email, password)
server.send_message(msg)
print("メールが正常に送信されました!")
return True
except Exception as e:
print(f"メール送信中にエラーが発生しました: {e}")
return False


if __name__ == "__main__":
print("添付ファイル付きメールの送信を開始します...")
send_email_with_attachments()




ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック