@רק-טוב מה שעשית זה מעולה, רק שבתור המלצה יהיה תמיד עדיף להשתמש ב-PHPMailer מאשר להשתמש ב-mail.
הפוסטים הטובים ביותר שנוצרו על ידי soris1989
-
RE: שליחת מייל בphp
-
RE: עזרה עם מודול API
בסופו של דבר השתמשתי ב-session, ונעזרתי בפוסט:
https://f2.freeivr.co.il/topic/13141/מה-זה-סשן-ואיך-משתמשים-בו/2 -
RE: הוספת משתנים באופן יזום לבקשה
@צדיק-תמים כתב בהוספת משתנים באופן יזום לבקשה:
session_id($_GET['ApiCallId']);
תודה רבה,
זה עזר לי מאוד!! -
RE: עזרה לגבי קליקרים
@אA
ההגדרה הזו מסירה את ההודעה של: "שלוחה 15" בכניסה לשלוחה. -
RE: שליחת מייל בphp
עדיף להשתמש ב-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}"; } ?>
-
RE: עזרה לגבי קליקרים
@אופיר מסכים ב-100%.
היו צריכים לדעתי להפריד את זה ל-2 הגדרות שונות. -
RE: בקשת POST בC# יוצרת שגיאה
@צדיק-תמים אני בדקתי, ומה ש@עידו אומר זה אמת.
יש בעיה בסיריאליזציה ב-C#, אגב, בדקתי את זה ב-postman וזה עובד (עם בקשת POST), ובדקתי את זה גם ב-PHP וזה גם עובד (גם עם בקשת POST).אם יש לך השגות על מה שנאמר כאן, אני מזמין אותך לנסות בעצמך את הנ"ל.
-
RE: מדוע נוצרת השגיאה הזו?
@עידו בניתי גם כן קוד ב-C# וקיבלתי את אותה השגיאה כאשר השתמשתי ב- HttpClient.PostAsync, כנראה שיש בעיה בסיראליזציה של ה-body, והטוקן לא מצליח להיות מתורגם כראוי.
למרות שנהוג להשתמש ב-POST לצורך יצירת משאבים (קבצים, נתנוים וכד'), כאן השתמשתי ב-HttpClient.GetAsync לצורך עקיפת הבעיה, וזה אכן הצליח ליצור קובץ לשלוחה הרצויה.
אגב, לצורך שימוש ב-API צריך לבצע 2 בקשות:
- הזדהות דרך מתודת קצה Login, לצורך קבלת ה-token.
- קריאה למתודת קצה המתאימה (שכאן היא UploadTextFile), תוך כדי השתלת ה-token ב-body או ב-header בהתאם לדוקומנטציה בקישור:
https://f2.freeivr.co.il/topic/55/api-גישת-מפתחים-למערכות/33?_=1739774721081
להלן הקוד:
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!"); } } }
פוסטים אחרונים שנוצרו על ידי soris1989
-
RE: האם הסשן נשמר במעבר בין שלוחות?
@צדיק-תמים אם כך מעולה! כבר כמעט ועברתי לשמירת נתוני קלט שמבוסס DB.
-
RE: האם הסשן נשמר במעבר בין שלוחות?
@צדיק-תמים ומה לגבי פרמטרים שהוכנסו לסשן בעת הקלט?
האם הם נמחקים מהסשן בעת מעבר לשלוחה אחרת? -
האם הסשן נשמר במעבר בין שלוחות?
לאחר שיישמתי אצלי את הקוד כפי שמובא (בצורה מפורטת ומדהימה) במאמר הנ"ל:
מה זה סשן ואיך משתמשים בו?רציתי לדעת האם במעבר בין שלוחות הסשן נשמר או שהוא מאותחל מחדש?
תודה רבה!
-
RE: קוד לעתקת קבצים שלא עובד
@רק-טוב לא כ"כ הבנתי. אתה רוצה להעתיק לשלוחה מסויימת קבצים?
-
RE: הגדרה בקו כשהשרת מחזיר id_list_message
@עידו כשאני משתמש ב-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"; }
-
RE: הגדרה בקו כשהשרת מחזיר id_list_message
@עידו באמצעות שלוחת API באופן הבא:
- משתמשים ב- read, ומגדירים שזה יהיה הקלטה (record) שזה בחינם, לעומת voice שעולה 0.4 יחידות.
- ההקלטה נשמרת על השרת של ימות המשיח.
- אני מוריד את ההקלטה ל-API שלי (שולח בקשה ל-API של ימות המשיח עבור מתודת קצה DownloadFile)
- לאחר שהקובץ יורד לשרת שלי, אני שולח את הקובץ לתמלול ב-API צד ג' (open-api, או google api וכו'), זה נקרא transcription.
- ה-API צד ג' מחזיר לי את התמלול לשרת שלי.
- ומכאן ממשיכים הלאה ב-flow של הקוד.
-
RE: הגדרה בקו כשהשרת מחזיר id_list_message
@עידו שמעתי את זה. תשים פסיקים בין הודעה להודעה. ככה:
t=הודעה 1, הודעה 2, הודעה 3
ואתה יודע מה, לא נראה לי שאתה צריך לשים .t (נקודה t) עבור כל הודעה, פשוט תשרשר את זה ותפריד עם פסיק בין הודעה להודעה.
-
RE: הגדרה בקו כשהשרת מחזיר id_list_message
@עידו אני מבין אותך גם אני רגיל לטלפון מקשים. בשביל לתמלל טקסטים אני משלב API צד ג' (כמו open ai), והוא מתמלל ממש בזול: $0.006 דולר לדקת תמלול... ו-0.36$ לשעת תמלול...זה ממש זול (לעומת 0.4 יחידות לתמלול בודד בימות המשיח).
לגבי המערכת, התקשרתי והקלדתי שס, וזה זרק אותי חזרה לתפריט של בחירת הוצאת ספרים.
-
RE: הגדרה בקו כשהשרת מחזיר id_list_message
@עידו אני לא בקיא במיפוי של המספרים לאותיות, מה צריך להקיש כדי שזה יתמפה ל-שס?