Skip to content

Commit b03b467

Browse files
동작 변경: MMS 사진 문자 전송 예제 및 샘플 이미지 추가
- 새로운 예제 파일 `message_send_mms.rs` 추가: 이미지 업로드를 포함한 MMS 전송 로직 구현. - 예제 실행 방법 및 환경 변수 설정에 대한 주석 추가: 사용자에게 필요한 정보를 명확히 제공하여 예제 사용을 용이하게 함. - MMS 전송 예제에 사용될 샘플 이미지 `example.jpg` 추가. - README.md 파일 업데이트: 새로운 MMS 전송 예제 및 샘플 이미지에 대한 설명 추가.
1 parent 57bfda5 commit b03b467

4 files changed

Lines changed: 282 additions & 0 deletions

File tree

examples/README.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
examples/
99
├── message_send_sms.rs # SMS 단건 전송 (동기 API)
1010
├── message_send_lms.rs # LMS 장문 전송 (동기 API)
11+
├── message_send_mms.rs # MMS 사진 문자 전송 (비동기 API, 이미지 업로드 포함)
1112
├── message_send_multiple.rs # 다중 수신자 전송 (동기 API)
1213
├── message_send_alimtalk.rs # 카카오 알림톡 단건 전송 (동기 API)
1314
├── message_send_scheduled.rs # 예약 발송 (동기 API)
1415
├── message_send_async.rs # SMS 전송 (비동기 API)
16+
├── message_send_voice.rs # 음성 메시지 전송 (동기 API)
17+
├── storage_upload_file.rs # 파일 업로드 (비동기 API)
18+
├── example.jpg # MMS 예제용 샘플 이미지
1519
└── README.md # 이 파일
1620
```
1721

@@ -24,6 +28,7 @@ examples/
2428
```bash
2529
export SOLAPI_API_KEY="your_api_key"
2630
export SOLAPI_API_SECRET="your_api_secret"
31+
# 발송 예제의 경우에만 설정
2732
export FROM_PHONE="01012345678" # 발신번호 (사전 등록 필요)
2833
export TO_PHONE="01087654321" # 수신번호
2934
```
@@ -34,3 +39,77 @@ export TO_PHONE="01087654321" # 수신번호
3439
# 프로젝트 루트에서 실행
3540
cargo run --example message_send_sms
3641
```
42+
43+
## 📝 예제 상세 설명
44+
45+
### 메시지 전송 예제
46+
47+
#### SMS 단건 전송
48+
```bash
49+
cargo run --example message_send_sms
50+
```
51+
- 기본적인 SMS(단문 문자) 전송 예제
52+
- 동기 API 사용
53+
54+
#### LMS 장문 전송
55+
```bash
56+
cargo run --example message_send_lms
57+
```
58+
- 최대 2,000byte까지 전송 가능한 장문 문자 예제
59+
- 제목(subject) 설정 가능
60+
61+
#### MMS 사진 문자 전송
62+
```bash
63+
cargo run --example message_send_mms
64+
# 또는 커스텀 이미지 파일 사용
65+
cargo run --example message_send_mms <이미지_파일_경로>
66+
```
67+
- 이미지가 포함된 MMS 전송 예제
68+
- Storage API를 통한 이미지 업로드 후 전송
69+
- 기본적으로 `examples/example.jpg` 사용
70+
71+
#### 다중 수신자 전송
72+
```bash
73+
cargo run --example message_send_multiple
74+
```
75+
- 한 번의 요청으로 여러 수신자에게 메시지 전송
76+
77+
#### 카카오 알림톡 전송
78+
```bash
79+
cargo run --example message_send_alimtalk
80+
```
81+
- 카카오톡 알림톡 전송 예제
82+
- 템플릿 ID와 변수 치환 기능 활용
83+
84+
#### 예약 발송
85+
```bash
86+
cargo run --example message_send_scheduled
87+
```
88+
- 특정 시간에 메시지를 예약 발송하는 예제
89+
90+
#### 비동기 API 사용
91+
```bash
92+
cargo run --example message_send_async
93+
```
94+
- Tokio 런타임을 사용한 비동기 메시지 전송 예제
95+
96+
#### 음성 메시지 전송
97+
```bash
98+
cargo run --example message_send_voice
99+
```
100+
- 음성 메시지(Voice) 전송 예제
101+
102+
### 스토리지 예제
103+
104+
#### 파일 업로드
105+
```bash
106+
cargo run --example storage_upload_file <이미지_파일_경로>
107+
```
108+
- Storage API를 사용한 파일 업로드 예제
109+
- MMS 발송 전 이미지 업로드에 사용
110+
111+
## 💡 팁
112+
113+
- MMS 전송 시 이미지는 먼저 Storage API를 통해 업로드한 후 반환된 `file_id`를 사용합니다.
114+
- 환경 변수는 `.env` 파일을 사용하거나 직접 export로 설정할 수 있습니다.
115+
- 발신번호는 SOLAPI 콘솔에서 사전 등록이 필요합니다.

examples/example.jpg

60.5 KB
Loading

examples/message_send_mms.rs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
//! MMS 사진 문자 전송 예제 (이미지 업로드 포함)
2+
//!
3+
//! 실행 방법:
4+
//! ```bash
5+
//! cargo run --example message_send_mms
6+
//! ```
7+
//!
8+
//! 환경 변수 설정:
9+
//! ```bash
10+
//! export API_KEY="your_api_key"
11+
//! export API_SECRET="your_api_secret"
12+
//! export FROM_PHONE="01012345678"
13+
//! export TO_PHONE="01087654321"
14+
//! ```
15+
16+
use base64::{engine::general_purpose, Engine as _};
17+
use solapi::message::{Message, MessageType, SendRequest};
18+
use solapi::storage::{FileType, UploadFileRequest};
19+
use solapi::SolapiClient;
20+
use std::env;
21+
use std::fs;
22+
23+
/// 파일을 base64로 인코딩하는 헬퍼 함수
24+
fn read_file_as_base64(file_path: &str) -> Result<String, Box<dyn std::error::Error>> {
25+
let file_content = fs::read(file_path)?;
26+
Ok(general_purpose::STANDARD.encode(&file_content))
27+
}
28+
29+
#[tokio::main]
30+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
31+
// 환경 변수에서 API 키 및 전화번호 가져오기
32+
let api_key = env::var("API_KEY").expect("API_KEY 환경 변수가 설정되지 않았습니다.");
33+
let api_secret = env::var("API_SECRET").expect("API_SECRET 환경 변수가 설정되지 않았습니다.");
34+
let from_phone = env::var("FROM_PHONE").expect("FROM_PHONE 환경 변수가 설정되지 않았습니다.");
35+
let to_phone = env::var("TO_PHONE").expect("TO_PHONE 환경 변수가 설정되지 않았습니다.");
36+
37+
// SOLAPI 클라이언트 생성
38+
let client = SolapiClient::new(api_key, api_secret);
39+
40+
// 1단계: 이미지 파일 업로드, 실제 MMS 발송 시 별도의 이미지 파일 경로를 사용하여 발송 해 주세요!
41+
println!("=== 1단계: 이미지 업로드 ===");
42+
let file_path = env::args()
43+
.nth(1)
44+
.unwrap_or_else(|| "examples/example.jpg".to_string());
45+
46+
println!("파일 읽기: {}", file_path);
47+
48+
// 파일을 base64로 인코딩
49+
let base64_content = match read_file_as_base64(&file_path) {
50+
Ok(content) => content,
51+
Err(e) => {
52+
eprintln!("파일 읽기 실패: {}", e);
53+
eprintln!("사용법: cargo run --example message_send_mms <파일경로>");
54+
return Err(e);
55+
}
56+
};
57+
58+
println!(
59+
"파일 크기: {} bytes (base64 인코딩 후)",
60+
base64_content.len()
61+
);
62+
63+
// 스토리지 서비스로 파일 업로드
64+
let storage = client.storage_service();
65+
let upload_request = UploadFileRequest {
66+
file: base64_content,
67+
name: Some(file_path.clone()),
68+
file_type: Some(FileType::Mms),
69+
link: None,
70+
};
71+
72+
println!("파일 업로드 중...");
73+
let upload_response = storage.upload(upload_request).await?;
74+
75+
println!("✓ 파일 업로드 성공!");
76+
println!(" 파일 ID: {}", upload_response.file_id);
77+
println!(" 파일 URL: {}", upload_response.url);
78+
79+
// 2단계: MMS 메시지 전송
80+
println!("\n=== 2단계: MMS 메시지 전송 ===");
81+
82+
let message_service = client.message_service();
83+
84+
// MMS 메시지 생성 (업로드된 image_id 사용)
85+
let message = Message::new(&to_phone)
86+
.from(&from_phone)
87+
.text("SOLAPI Rust SDK MMS 테스트\n\n이미지가 첨부된 MMS 메시지입니다.")
88+
.message_type(MessageType::MMS)
89+
.subject("MMS 발송 테스트");
90+
91+
// image_id 설정
92+
let mut message = message;
93+
message.image_id = Some(upload_response.file_id);
94+
95+
let request = SendRequest {
96+
messages: vec![message],
97+
allow_duplicates: None,
98+
scheduled_date: None,
99+
show_message_list: None,
100+
};
101+
102+
println!("MMS 메시지 전송 중...");
103+
println!("발신번호: {}", from_phone);
104+
println!("수신번호: {}", to_phone);
105+
106+
// 메시지 전송 (비동기)
107+
match message_service.send(request).await {
108+
Ok(response) => {
109+
println!("\n✓ MMS 전송 성공!");
110+
println!("그룹 ID: {}", response.group_info.group_id);
111+
println!("상태: {}", response.group_info.status);
112+
println!("총 메시지 수: {}", response.group_info.count.total);
113+
println!("성공: {}", response.group_info.count.registered_success);
114+
println!("실패: {}", response.group_info.count.registered_failed);
115+
116+
if !response.failed_message_list.is_empty() {
117+
println!("\n⚠ 실패한 메시지:");
118+
for failed in response.failed_message_list {
119+
println!(" - {}: {}", failed.to, failed.status_message);
120+
}
121+
}
122+
}
123+
Err(e) => {
124+
eprintln!("\n✗ MMS 전송 실패!");
125+
eprintln!("오류: {:?}", e);
126+
return Err(e.into());
127+
}
128+
}
129+
130+
Ok(())
131+
}

examples/storage_upload_file.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
use base64::{engine::general_purpose, Engine as _};
2+
use solapi::storage::{FileType, UploadFileRequest};
3+
use solapi::SolapiClient;
4+
use std::env;
5+
use std::fs;
6+
7+
fn read_file_as_base64(file_path: &str) -> Result<String, Box<dyn std::error::Error>> {
8+
let file_content = fs::read(file_path)?;
9+
Ok(general_purpose::STANDARD.encode(&file_content))
10+
}
11+
12+
#[tokio::main]
13+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
14+
// 환경 변수에서 API 키 읽기
15+
let api_key = env::var("API_KEY").expect("API_KEY 환경 변수가 설정되지 않았습니다.");
16+
let api_secret = env::var("API_SECRET").expect("API_SECRET 환경 변수가 설정되지 않았습니다.");
17+
18+
// SOLAPI 클라이언트 생성
19+
let client = SolapiClient::new(api_key, api_secret);
20+
let storage = client.storage_service();
21+
22+
// 테스트 파일 경로 (예제용 - 실제 파일 경로로 변경 필요)
23+
let file_path = env::args()
24+
.nth(1)
25+
.unwrap_or_else(|| "examples/example.jpg".to_string());
26+
27+
println!("파일 읽기: {}", file_path);
28+
29+
// 파일을 base64로 인코딩
30+
let base64_content = match read_file_as_base64(&file_path) {
31+
Ok(content) => content,
32+
Err(e) => {
33+
eprintln!("파일 읽기 실패: {}", e);
34+
eprintln!("사용법: cargo run --example storage_upload_file <파일경로>");
35+
return Err(e);
36+
}
37+
};
38+
39+
println!(
40+
"파일 크기: {} bytes (base64 인코딩 후)",
41+
base64_content.len()
42+
);
43+
44+
// 업로드 요청 생성
45+
let request = UploadFileRequest {
46+
file: base64_content,
47+
name: Some(file_path.clone()),
48+
file_type: Some(FileType::Mms),
49+
link: None,
50+
};
51+
52+
println!("파일 업로드 중...");
53+
54+
// 파일 업로드
55+
let response = storage.upload(request).await?;
56+
57+
println!("\n업로드 성공!");
58+
println!("파일 ID: {}", response.file_id);
59+
println!("파일 이름: {}", response.name);
60+
println!("원본 이름: {}", response.original_name);
61+
println!("파일 타입: {}", response.file_type);
62+
println!("파일 URL: {}", response.url);
63+
println!("계정 ID: {}", response.account_id);
64+
println!("생성 날짜: {}", response.date_created);
65+
println!("수정 날짜: {}", response.date_updated);
66+
67+
if let Some(link) = response.link {
68+
println!("링크: {}", link);
69+
}
70+
71+
Ok(())
72+
}

0 commit comments

Comments
 (0)