Score:0

hook_mail_alter() ไม่ลบส่วนหัว Return-Path, Sender และ Reply-To

ธง us

ฉันต้องการลบ เส้นทางกลับ, ผู้ส่ง, และ ตอบกลับ ส่วนหัวจากอีเมลที่ส่ง ฉันพยายามทำให้สำเร็จโดยใช้รหัสต่อไปนี้ แต่ส่วนหัวจะไม่ถูกลบออกจากอีเมล

ฟังก์ชัน mymodule_mail_alter(&$message) {
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

ผมทำอะไรผิดหรือเปล่า?

fr flag
มีอะไรอีกมากที่ยังไม่ได้พูด ... เช่น ปลั๊กอิน @Mail ที่คุณใช้อยู่
us flag
เรากำลังใช้ PHP mailer เริ่มต้นของ Drupal 8 และโมดูล SMTP เรากำลังพยายามเริ่มการทำงานของ Test Mail ผ่านโมดูล SMTP หลังจากป้อนข้อมูลรับรอง แต่ดูเหมือนว่าเราไม่สามารถแก้ไขส่วนหัวจาก hook_mail_alter
imclean avatar
my flag
เหตุใดการแก้ไขของฉันจึงถูกปฏิเสธ ความคิดเห็นของ @ secretsayan ด้านบนเพิ่มข้อมูลที่จำเป็นซึ่งควรอยู่ในคำถาม มันจำกัดให้แคบลงไปที่โมดูล SMTP แทนที่จะเป็นแค่ Drupal core
Score:1
ธง us

การลบค่าจาก $ข้อความ['ส่วนหัว'] เท่านั้นยังไม่พอ เพราะปลั๊กอินที่ใช้ส่งอีเมลก็ใช้ได้เช่นกัน $message['เส้นทางขากลับ'], $ข้อความ['ผู้ส่ง'], หรือ $message['ตอบกลับ'] ค่าในการสร้างส่วนหัวของอีเมล คลาสที่ใช้เป็นปลั๊กอินเริ่มต้นในการส่งอีเมล PhpMail ใช้โค้ดต่อไปนี้ แต่ปลั๊กอินอื่นๆ สามารถใช้โค้ดอื่นได้

$site_mail = $this->configFactory->get('system.site')->get('mail');
$additional_headers = isset($message['Return-Path']) && ($site_mail === $message['Return-Path'] || static::_isShellSafe($message['Return-Path'])) ? '-ฉ' . $message['เส้นทางย้อนกลับ'] : '';
$mail_result = @mail($message['to'], $mail_subject, $mail_body, $mail_headers, $additional_headers);

เนื่องจากปลั๊กอินอีเมลใช้เพื่อส่งอีเมลหลังจาก hook_mail_alter() การใช้งานถูกเรียกใช้งาน และเนื่องจากปลั๊กอินอีเมลสามารถเพิ่มหนึ่งในส่วนหัวเหล่านั้นได้ตามที่เห็นสมควร จึงไม่มีการรับประกันใดๆ ว่าอีเมลจะถูกส่งโดยไม่มีส่วนหัวเหล่านั้น สมมติว่าปลั๊กอินอีเมลเพิ่มเฉพาะส่วนหัวเหล่านั้นเมื่อ $ข้อความ หรือ $ข้อความ['ส่วนหัว'] มีค่าสำหรับพวกเขา รหัสต่อไปนี้ควรใช้งานได้

ฟังก์ชัน mymodule_mail_alter(&$message) {
  unset($message['Return-Path']);
  unset($message['ผู้ส่ง']);
  unset($message['ตอบกลับ']);
  unset($message['headers']['Return-Path']);
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}
fr flag
ฉันต้องการเพิ่มว่า RFC ระบุว่าส่วนหัวไม่คำนึงถึงขนาดตัวพิมพ์ ตัวอย่างเช่น "unset($message['headers']['Return-Path']);" ไม่เพียงพอ - คีย์ส่วนหัวอาจเป็น "เส้นทางย้อนกลับ" ดังนั้นการไม่ตั้งค่าของคุณจะไม่ทำอะไรเลย ในทำนองเดียวกัน ปลั๊กอิน @Mail อาจใช้ตัวพิมพ์บางตัว ดังนั้นแม้ว่าปลั๊กอินจะพยายามเคารพตัวเลือกของคุณ แต่ตัวพิมพ์ที่คุณใช้ก็อาจทำให้สะดุดได้บรรทัดล่างคือสิ่งที่ apademo กล่าวไว้ข้างต้น: "เนื่องจากปลั๊กอินอีเมลใช้เพื่อส่งอีเมลหลังจากการใช้งาน hook_mail_alter() ถูกเรียกใช้ ... ไม่มีการรับประกันใด ๆ อีเมลจะถูกส่งโดยไม่มีส่วนหัวเหล่านั้น"
Score:0
ธง my

เดอะ เอสเอ็มทีพี โมดูลจะตั้งค่าส่วนหัวบางอย่างเสมอซึ่งไม่สามารถยกเลิกการตั้งค่าได้ ดูบรรทัดต่อไปนี้จาก Drupal\smtp\Plugin\Mail\SMTPMailSystem:

$headers['ผู้ส่ง'] = $จาก;
$headers['เส้นทางย้อนกลับ'] = $จาก;
$headers['ตอบกลับถึง'] = $จาก;

นี่คือการทำให้มันเข้ากันได้กับ Drupal core ซึ่งทำได้เหมือนกันจากที่ผมบอก

สำหรับการควบคุมเพิ่มเติม คุณสามารถใช้โมดูล PHPMailer SMTP ซึ่งยกเลิกการตั้งค่าอย่างชัดเจนแทน เส้นทางกลับ ส่วนหัวเพื่อให้สอดคล้องกับ อาร์เอฟซี 5321.

นอกจากนี้ยังไม่ตั้งสมมติฐานว่าควรมีส่วนหัวพิเศษใด (เกินกว่าที่กำหนด) และจะตั้งค่าเฉพาะเมื่อเพิ่มไว้ที่อื่นเท่านั้น

ข้อมูลต่อไปนี้จะใช้ได้หากกรณีของส่วนหัวตรงกัน:

ฟังก์ชัน mymodule_mail_alter(&$message) {
  unset($message['headers']['Sender']);
  unset($message['headers']['Reply-To']);
}

อีกทางหนึ่ง ต่อไปนี้จะยกเลิกการตั้งค่าส่วนหัวโดยไม่คำนึงถึงกรณี:

ฟังก์ชัน mymodule_mail_alter(&$message) {
  $message['ส่วนหัว'] = array_change_key_case($message['ส่วนหัว']);
  unset($message['headers']['sender']);
  unset($message['headers']['reply-to']);
}

PHPMailer SMTP ใช้สำหรับส่งอีเมลเท่านั้นและไม่ได้ทำการจัดรูปแบบ HTML ดังนั้นคุณจำเป็นต้องใช้โมดูลเช่น จดหมาย MIME เพื่อจุดประสงค์นั้น

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน PHPMailer SMTP

Score:-1
ธง jp

ใช้ฟังก์ชัน hook_mail($key, &$message, $params) แทน นอกจากนี้ คุณจะต้องมี $key เพิ่มเติม ซึ่งฉันเชื่อว่าจะแยกแยะได้ว่าฟังก์ชันใดเป็นอีเมลที่ส่ง

จากนั้น hook นี้จะถูกเรียกใช้เมื่อส่งจดหมายด้วยตนเอง:

$send = จริง;
$mailManager = \Drupal::service('plugin.manager.mail');
$result = $mailManager->mail($module, $key, $to, $langcode, $params, null, $send);

ฉันอยากจะแนะนำให้ใช้ Swiftmailer มันละเว้นการทำงานด้วยตนเองทั้งหมด

apaderno avatar
us flag
ฉันใช้ OP ต้องการลบส่วนหัวเหล่านั้นออกจากอีเมลทุกฉบับ `hook_mail()` จะไม่ช่วยอะไร
apaderno avatar
us flag
แม้ว่า OP ต้องการลบส่วนหัว Return-Path, Sender และ Reply-To ออกจากอีเมลที่ส่งโดยโมดูลที่ OP เขียนหรือโดยโมดูลเฉพาะ คำตอบนี้ไม่ได้บอกว่าจะบรรลุได้อย่างไร

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา