@רק-טוב מה שעשית זה מעולה, רק שבתור המלצה יהיה תמיד עדיף להשתמש ב-PHPMailer מאשר להשתמש ב-mail.

@רק-טוב מה שעשית זה מעולה, רק שבתור המלצה יהיה תמיד עדיף להשתמש ב-PHPMailer מאשר להשתמש ב-mail.

בסופו של דבר השתמשתי ב-session, ונעזרתי בפוסט:
https://f2.freeivr.co.il/topic/13141/מה-זה-סשן-ואיך-משתמשים-בו/2
@צדיק-תמים כתב בהוספת משתנים באופן יזום לבקשה:
session_id($_GET['ApiCallId']);
תודה רבה,
זה עזר לי מאוד!!
@אA
ההגדרה הזו מסירה את ההודעה של: "שלוחה 15" בכניסה לשלוחה.
עדיף להשתמש ב-PHPMailer.
קודם כל יש להוריד את החבילה באמצעות composer:
composer require phpmailer/phpmailer
וזה קוד לדוגמא:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php'; // Include Composer's autoloader
$mail = new PHPMailer(true);
try {
// SMTP Configuration
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // Replace with your SMTP host
$mail->SMTPAuth = true;
$mail->Username = 'your_email@example.com'; // Your email
$mail->Password = 'your_email_password'; // Your email password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Use `PHPMailer::ENCRYPTION_SMTPS` for SSL
$mail->Port = 587; // Change to 465 if using SSL
// Sender & Recipient
$mail->setFrom('your_email@example.com', 'Your Name');
$mail->addAddress('recipient@example.com', 'Recipient Name');
// Attachments
$mail->addAttachment('/path/to/file.pdf'); // Example: Attach a PDF
$mail->addAttachment('/path/to/image.jpg', 'CustomFileName.jpg'); // Rename attachment
// Email Content
$mail->isHTML(true);
$mail->Subject = 'Test Email with Attachment';
$mail->Body = '<h3>Hello,</h3><p>This is a test email with an attachment.</p>';
$mail->AltBody = 'Hello, This is a test email with an attachment.'; // Plain text fallback
// Send Email
$mail->send();
echo 'Email sent successfully!';
} catch (Exception $e) {
echo "Email could not be sent. Error: {$mail->ErrorInfo}";
}
?>
@אופיר מסכים ב-100%.
היו צריכים לדעתי להפריד את זה ל-2 הגדרות שונות.
@צדיק-תמים אני בדקתי, ומה ש@עידו אומר זה אמת.
יש בעיה בסיריאליזציה ב-C#, אגב, בדקתי את זה ב-postman וזה עובד (עם בקשת POST), ובדקתי את זה גם ב-PHP וזה גם עובד (גם עם בקשת POST).
אם יש לך השגות על מה שנאמר כאן, אני מזמין אותך לנסות בעצמך את הנ"ל.
@עידו בניתי גם כן קוד ב-C# וקיבלתי את אותה השגיאה כאשר השתמשתי ב- HttpClient.PostAsync, כנראה שיש בעיה בסיראליזציה של ה-body, והטוקן לא מצליח להיות מתורגם כראוי.
למרות שנהוג להשתמש ב-POST לצורך יצירת משאבים (קבצים, נתנוים וכד'), כאן השתמשתי ב-HttpClient.GetAsync לצורך עקיפת הבעיה, וזה אכן הצליח ליצור קובץ לשלוחה הרצויה.
אגב, לצורך שימוש ב-API צריך לבצע 2 בקשות:
להלן הקוד:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace YemotUploadTextFile
{
internal class Program
{
static void Main(string[] args)
{
UploadTextFileWithGet().GetAwaiter().GetResult();
Console.WriteLine("Done!");
}
static async Task UploadTextFileWithGet()
{
var username = "<username>";
var password = "<password>";
var client = new HttpClient();
try
{
// login yemot system for getting token
HttpResponseMessage responseJ = await client.GetAsync(
$"https://www.call2all.co.il/ym/api/Login?username={username}&password={password}");
// בדיקת מצב התגובה
if (responseJ.IsSuccessStatusCode)
{
// קריאת התוכן של התגובה
string responseContent = await responseJ.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {responseContent}");
var responseObj = JsonConvert.DeserializeObject<JObject>(responseContent);
if (responseObj["responseStatus"].ToString() == "OK")
{
// send a get request to upload file on yemot server
string token = responseObj["token"].ToString();
string what = "ivr2:14/text_file.ini";
string contents = "Some test message";
Console.WriteLine($"Response: {token}");
client = new HttpClient();
var responseJ2 = await client.GetAsync($"https://www.call2all.co.il/ym/api/UploadTextFile?token={token}&what={what}&contents={contents}");
// בדיקת מצב התגובה
if (responseJ2.IsSuccessStatusCode)
{
// קריאת התוכן של התגובה
var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {responseContent2}");
}
else
{
Console.WriteLine($"Error: {responseJ2.StatusCode}");
return;
}
}
else
{
Console.WriteLine($"Error: {responseObj["message"]}");
return;
}
}
else
{
Console.WriteLine($"Error: {responseJ.StatusCode}");
return;
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
await Task.Delay(1000);
Console.WriteLine("Async work done!");
}
}
}
@צדיק-תמים אם כך מעולה! כבר כמעט ועברתי לשמירת נתוני קלט שמבוסס DB.
@צדיק-תמים ומה לגבי פרמטרים שהוכנסו לסשן בעת הקלט?
האם הם נמחקים מהסשן בעת מעבר לשלוחה אחרת?
לאחר שיישמתי אצלי את הקוד כפי שמובא (בצורה מפורטת ומדהימה) במאמר הנ"ל:
מה זה סשן ואיך משתמשים בו?
רציתי לדעת האם במעבר בין שלוחות הסשן נשמר או שהוא מאותחל מחדש?
תודה רבה!
@רק-טוב לא כ"כ הבנתי. אתה רוצה להעתיק לשלוחה מסויימת קבצים?
@עידו כשאני משתמש ב-read עם פרמטר record, אז מה שמוחזר בבקשה העוקבת זה הניתוב לקובץ שהוקלט.
ועם הניתוב הזה אתה עושה DownloadFile.
שם ההקלטה הוא לא קבוע מראש, אלא כחלק מהפרמטרים שאתה מזין ב-read (עבור record), כלומר שם התיקיה ושם הקובץ שבהם אתה שומר את ההקלטה בימות המשיח, וזה שרירותי, כלומר אתה בוחר את הפרמטרים הללו.
לדוגמא: (קוד להמחשה שבניתי)
if (!$_GET["target_path_of_name"]) {
readRecord("t-אנא הקליטו את שמכם בקול ברור, לסיום הקישו סולמית", "target_path_of_name", "", "/6/1", time() . "_caller_name_record");
exit;
}
$target_path_of_name= $_GET["target_path_of_name"];
$audio_stream = post({
url: 'https://www.call2all.co.il/ym/api/DownloadFile',
token: 'username:password',
path: "ivr2:$target_path_of_name"
})
$destPath = __DIR__ . '/./audio/' . time() . 'bla.wav';
file_put_contents($destPath, $audio_stream);
function readRecord(
$prompt,
$param_name,
$get_new_value = '',
$api_dir = '',
$file_name = '',
$play_menu = '',
$save_on_hangup = '',
$file_exists_record_append = '',
$min_record_time = '',
$max_record_time = ''
) {
echo "read=$prompt=$param_name,$get_new_value,record,$api_dir,$file_name,$play_menu,$save_on_hangup,$file_exists_record_append,$min_record_time,$max_record_time";
}
@עידו באמצעות שלוחת API באופן הבא:
@עידו שמעתי את זה. תשים פסיקים בין הודעה להודעה. ככה:
t=הודעה 1, הודעה 2, הודעה 3
ואתה יודע מה, לא נראה לי שאתה צריך לשים .t (נקודה t) עבור כל הודעה, פשוט תשרשר את זה ותפריד עם פסיק בין הודעה להודעה.
@עידו אני מבין אותך גם אני רגיל לטלפון מקשים. בשביל לתמלל טקסטים אני משלב API צד ג' (כמו open ai), והוא מתמלל ממש בזול: $0.006 דולר לדקת תמלול... ו-0.36$ לשעת תמלול...זה ממש זול (לעומת 0.4 יחידות לתמלול בודד בימות המשיח).
לגבי המערכת, התקשרתי והקלדתי שס, וזה זרק אותי חזרה לתפריט של בחירת הוצאת ספרים.
@עידו אני לא בקיא במיפוי של המספרים לאותיות, מה צריך להקיש כדי שזה יתמפה ל-שס?