วันจันทร์ที่ 27 กรกฎาคม พ.ศ. 2563

Email หาย เมื่อส่งจาก Outlook ไปที่ Zimbra


      ปัญหาหนึ่งที่ผู้ดูแลระบบหรือผู้ใช้ zimbra อาจจะเคยเจอหรือได้รับรายงาน คือมีการส่ง Email เข้ามาที่เครื่อง Zimbra แล้วผู้รับไม่ได้รับ แต่ไม่ได้เป็นทุกครั้ง และส่วนใหญ่จะหาสาเหตุไม่ได้ ผมเองก็ได้รับรายงานจากลูกค้าผมเหมือนกัน ตอนแรกๆ ก็สงสัยว่าเกิดอะไรขึ้น จนสุดท้าย เมื่อได้รับรายงานและมีข้อมูลให้วิเคราะห์มากพอ เมื่อตรวจสอบลึกลงไป ก็ได้ทราบถึงสาเหตุ และวิธีการแก้ไข ตามนี้ครับ

สถานการณ์ที่เกิดขึ้นกับผม 
  • user_a@senderdomain.com มีการส่ง Email มายัง Zimbra  โดยส่งมาให้ user_b@zimbradomain.com และ CC: user_c@zimbradomain.com
  • user_b@zimbradomain.com ไม่ได้รับ Email นี้
  • แต่ user_c@zimbradomain.com ได้รับ Email 
ส่ิงที่ผมทำก็คือ ดูที่ /var/log/zimbra.log  เพื่อดูว่า เครื่อง Zimbra ได้รับ Email ที่ว่านี้จาก user_a  หรือไม่ ข้อมูลจาก log file คือ เครื่อง Zimbra ได้รับ Email และส่งต่อไปให้ ยัง User B และ User C แล้ว ตามข้อมูลนี้ 
Jul 16 17:22:36 mail amavis[595]: (00595-15) Passed CLEAN {RelayedInternal}, ORIGINATING_POST/MYNETS LOCAL [127.0.0.1]:43744 [110.170.164.226] <user_a@senderdomain.com> -> <user_c@zimbradomain.com>,<user_b@zimbradomain.com>, Queue-ID: 559BC40DE6EAE, Message-ID: <!&!AAAAAAAAAAAYAAAAAAAAAHMG31lBzq9EnA4ND3fjIazCgAAAEAAAALwAfFLJ9TdEgSYwUSy/GGEBAAAAAA==@senderdomain.com>, mail_id: I

Jul 16 17:22:36 mail amavis[595]: (00595-15) IyGsl1CPBC8i FWD from <user_a@senderdomain.com> -> <user_c@zimbradomain.com>,<user_b@zimbradomain.com>, BODY=7BIT 250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as CF12E40DE6E91

.....

Jul 16 17:22:37 mail postfix/lmtp[1001]: CF12E40DE6E91: to=<user_c@zimbradomain.com>, relay=mail.zimbradomain.com[192.168.22.43]:7025, delay=0.22, delays=0.06/0/0.05/0.12, dsn=2.1.5, status=sent (250 2.1.5 Delivery OK)

Jul 16 17:22:37 mail postfix/lmtp[1001]: CF12E40DE6E91: to=<user_b@zimbradomain.com>, relay=mail.zimbradomain.com[192.168.22.43]:7025, delay=0.22, delays=0.06/0/0.05/0.12, dsn=2.1.5, status=sent (250 2.1.5 Delivery OK)

Jul 16 17:22:37 mail postfix/qmgr[5540]: CF12E40DE6E91: removed
วิเคราะห์ข้อมูลต่อ ใน mailbox.log

สิ่งที่ผมทำต่อคือ ดูข้อมูลในไฟล์ /opt/zimbra/log/mailbox.log ดูว่า user_b ทำไม่ได้รับ Email โดยผมกรองเฉพาะ log ที่เกี่ยวข้องกับ user_b มาดู ผมไปเจอ message ที่น่าสนใจคือ 
2020-07-16 17:22:37,066 INFO  [LmtpServer-59285] [name=user_b@zimbradomain.com;mid=175;ip=192.168.22.43;]
lmtp - Not delivering message with duplicate Message-ID
 <!&!AAAAAAAAAAAYAAAAAAAAAHMG31lBzq9EnA4ND3fjIazCgAAAEAAAALwAfFLJ9TdEgSYwUSy/GGEBAAAAAA==@senderdomain.com>
ลองหาข้อมูลเกี่ยวกับ "Not delivering message with duplicate Message-ID" ที่เกียวข้องกับ Zimbra ว่าคืออะไร สรุปก็คือ Zimbra จะมีการ เก็บ Message-ID ของ Email แต่ละฉบับที่ส่งเข้ามาให้กับแต่ละ Account บน Zimbra ย้อนหลังไว้จำนวนหนึ่ง ซึ่งเมื่อ มี Email ใหม่เข้ามา Zimbra จะตรวจสอบ Message-ID ของ Email ใหม่เที่ยบกับ Message-id ที่เคยเก็บไว้ของ User นั้นๆ ซึ่งถ้าเจอว่า มี Message-ID ซ้ำ Zimbra ก็จะไม่ส่ง Email นี้ไปที่ inbox ของ User

Message-ID คืออะไร 

    เมื่ออ่านถึงตรงนี้ ผู้อ่านหลายท่านคงสงสัยว่า แล้ว Message-id นี้คืออะไร ขออธิบายง่ายๆ แล้วกันครับ ว่า Message-ID จะเหมือนหมายเลขประจำตัว ของ Email แต่ละฉบับ จะถูกสร้างตั้งแต่ต้นทางที่สร้าง Email ขึ้นมา เช่น Email Client (MS outlook , thunderbird, ...) หรือ ระบบ Webmail  โดย Message-ID นี้จะฝังอยู่ใน Email Header  เราสามารถหาดูได้โดยดูบรรทัดที่ขึ้นต้นด้วยคำว่า Message-ID: ใน Email Header ดังตัวอย่างตามรูป


จากรุป Message-ID ของ Email ในรูปคือ 5ec3add-be8b-c846-1c55-0fa33428aac1@xsidekick.com

ซึ่งโดยปกติ ค่าจะถูกสร้างมาโดยไม่ซ้ำกัน และไม่ซ้ำกับ Email อื่นๆ ด้วยครับ

ส่วนวิธีการดู  Email Header ของ Email ใน Zimbra โดยใช้ Web client ลองอ่านวิธีดูบทความนี้ดูนะครับ

นอกจากนี้ ใน /var/log/zimbra.log จะมีการเก็บ Message-ID ของ Email ทีี่มีการรับส่งด้วย ลองดูในตัวอย่าง log ที่ผมใส่ไว้ตอนต้นบทความก็ได้ จะเห็น Message-ID ของ Email นี้อยู่ด้วย และในไฟล์ /opt/zimbra/log/mailbox.log ที่บอกว่า เจอ duplicate Message-ID ก็จะมีการระบุ Message ID ที่เจอว่า Duplicate ไว้ด้วย

Microsoft Outlook ต้นเหตุของปัญหา

     เมื่อลองพยายามค้นหาข้อมูลต่อ ก็พบว่า มันคนเคยเจอปัญหานี้เหมือนกัน เค้าระบุว่า ต้นตอของปัญหานี้เกิดจากคนส่ง Email ใช้ Microsoft Outlook  เขียน Email และส่งออกมา ซึ่ง ตัว Outlook เองจะมีประเด็น (เท่าที่มีข้อมูลเป็น MS Outlook 2010) ที่ทำให้  Email  บางฉบับที่ส่งออก มี Message-ID ซ้ำกับ Email ที่เคยส่งออกมาแล้ว

โดยกรณีของผม  พบว่าสถานการณ์ที่ ทำให้ Outlook สร้าง Message-ID คือ

1) user_a@senderdomain.com ใช้งาน MS Outlook  ส่ง Email ฉบับหนึ่งให้ user_b@zimbradomain.com
2) หลังจากนั้น user_a@senderdomain.com ทำการเขียน Email อีกฉบับโดย Forward  จาก Email ในข้อ 1) ไปให้ user_b@zimbradomain.com ตามสถาณการณ์ ที่ได้เล่าไปตั้งแต่แรก 

ซึ่งในกรณีที่ผมเจอ พอสืบย้อนกลับไป พบว่า ก่อนหน้าที่จะเกิด Message-ID Duplication ใน Zimbra user_a@senderdomain.com ได้เคยส่ง Email ให้กับ user_b@zimbradomain.com จริงๆ และ หลังจากนั้น เค้าได้ Forward Email ที่เคยส่งไปแล้ว ให้กับ user_b@zimbradomain.com อีกครัั้ง แต่คราวนี้ CC: user_c@zimbradomain.com ด้วย

และถ้ากลับไปดูที่ Email header ทั้งสองฉบับ (ฉบับทีส่งครั้งแรก และ ฉบับที่ Forward ) เราจะเจอว่า

  • Message-ID ซ้ำกัน
  • แถมเจอร่องรอยอีกบรรทัดคือ  
X-Mailer: Microsoft Outlook 16.0
ซึ่งบรรทัดนี้ เป็นตัวบอกว่า Email ที่เกิดปัญหา ถูกส่งจาก MS Outlook จริงๆ แต่เป็น version  2016 (จุดนี้บอกพวกเราเป็นนัยๆ ว่าอาการแบบนี้มีใน MS Outlook หลายๆ version)

ปัญหาคือ ตกลงมันเป็น Bug ของ MS outlook จริงๆ หรือเป็นพฤติกรรมปกติของ Email Client ทั่วไป ผมเลยลองทดสอบส่ง Email โดยใช้ Thunderbird จำลองสถานการณ์แบบเดียวกัน ผลปรากฎว่า Message-ID ไม่ซ้ำ ทำให้คิดว่าน่าจะเป็น Bug ของ MS Outlook จริงๆ (ใครรู้จริงช่วยบอกหน่อย)

การแก้ไข

     ปัญหาอยู่ตรงนี้ครับ เพราะคนที่ส่ง Email ที่มี Message-ID ซ้ำนี้ เป็นคนนอกองค์กร จะไปบังคับเค้าให้ใช้ Email Client ยี่ห้ออื่น หรือลง Patch ของ MS Outlook ก็ลำบาก เราคงต้องมาหาทางแก้ปัญหากันที่ระบบ Zimbra ของเราเอง (แบบอ้อมๆ) ซึ่งก็โชคดีครับ พอจะทำได้

วิธีการก็คือ เราต้อง setup Zimbra ไม่ได้ทำการเช็ค Message-ID ซ้ำ โดย

ใช้คำสั่ง zmprov ที่ Linux command line แก้ไข config parameter ที่ชื่อ zimbraMessageIdDedupeCacheSize ให้เป็น 0 (ปกติ จะเป็น 3000)  ตามนี้
zmprov mcf zimbraMessageIdDedupeCacheSize 0 
คำสั่งนี้ ต้องเรียกใช้ในขณะที่เป็น Account ที่ชื่อ Zimbra บน Linux ซึ่งขั้นตอนดูตามบทความนี้ครับ

ซึ่งเราสามารถตรวจสอบได้ว่าค่า zimbraMessageIdDedupeCacheSize ถูก set เป็น 0 แล้วจริงๆ หรือเปล่าโดยใช้คำสั่ง
zmprov gcf zimbraMessageIdDedupeCacheSize
คำสั่งนี้จะแสดงค่า zimbraMessageIdDedupeCacheSize ที่ถูก set อยู่ ณ.ขณะนั้น

เสร็จแล้วทำการ Restart service ของ Zimbra ที่ชื่อ mailboxd เพื่อให้  Zimbra รับรู้ค่าที่เรา set ใหม่นี้ โดยใช้คำสั่ง
zmmailboxdctl restart
ตัวอย่างเช่น







ข้อควรระวังของการแก้ไขโดยใข้วิธีการนี้ 

      ตามที่ได้บอกไปว่าวิธีการแก้ไขนี้ เป็นการปิดระบบของ Zimbra ไม่ให้ตรวจสอบ Message-id ซ้ำ ดังนั้นเป็นไปได้ว่าหลังจากนี้ ผู้ใช้ระบบของเรา อาจจะเจอว่าได้รับ Email ซ้ำในระบบ ซึ่งส่วนใหญ๋ เกิดจากข้อผิดพลาดในระบบ Email ตั้งแต่ตั้นทางมาถึงปลายทางคือเครื่อง Zimbra ของเรา ดังนั้น ผู้ดูแลระบบควรจะต้องแจ้งให้ User หรือผู้ดูและระบบคนอื่นๆในองค์กรทราบด้วย

หวังว่าคงจะได้ประโยชน์ และสามารถนำความรู้จากบทความนี้ ไปแก้ไขปัญหา Zimbra กันนะครับ

อ้างอิง https://forums.zimbra.org/viewtopic.php?t=28155




วันอังคารที่ 21 กรกฎาคม พ.ศ. 2563

วิธี download ข้อมูลรายชื่อ Account บน Zimbra ผ่านทาง Admin Console


หลายๆครั้งที่ผมได้รับคำถาม จากผู้ดูแลระบบ Zimbra ว่าอยากได้รายชื่อ ของ Account ที่มีอยู่ใน Zimbra ออกมา รวมถึงข้อมูลบางอย่าง ของแต่ละ Account เช่น ชื่อ นามสกุล ของ user หรือ Status (Active/Close) ของ Account  มีวิธีการ Export ออกมาอย่างไรได้บ้าง

ถ้าเป็นเมื่อก่อน คงต้องอาศัย Linux command line ร่วมกับกับการเขียนโปรแกรม แต่ใน Zimbra Version ใหม่ๆ เราสามารถ Export ออกมาได้เลย โดยมีขั้นตอนดังนี้ครับ

1) Login Admin Console  (https:// ... :7071)

2) ทำการค้นหารายชื่อที่เราต้องการสร้างรายงาน เช่น ผมต้องการ Account ทั้งหมดใน Domain ที่ชื่อ mydomain.com บนเครื่องผม โดย

   2.1)  ไปที่  Search bar  ที่อยู่ด้านบนสุดของหน้าจอ


   2.2) เลือก ชนิดของสิ่งที่ต้องการค้นหา ว่าต้องการ search หาอะไร (Account / Distribution List, Alias ...) โดยกดที่ปุ่มรูปสามเหลียมหลัง Icon เพื่อเปิดเมนู แล้วเลือกชนิดของสิ่งที่ต้องการค้นหา


 
   2.3) ป้อนคำที่ใช้ Search จากตัวอย่าง ผมป้อน mydomain.com   
    2.4) ทำการค้นหาโดยคลิ๊กที่รูปแว่นขยายท้าย search bar




เมื่อเสร็จขั้นตอนนี้ ผมจะได้รายชื่อ Email address  ใน mydomain.com พร้อมข้อมูลอื่นๆออกมาที่หน้าจอ ดังตัวอย่างตามรูป



3) ทำการ Export ข้อมูล ออกมาเป็น .csv  Ffp คลิ๊กไปที่ Icon รูปเฟืองเพื่อกางเมนู และเลือก Download

ขั้นตอนนี้ จะมีการ Download ไฟล์ ที่ชื่อ search_result.csv จาก web browser มาที่ Desktop ตามชื่อ Directory ที่ตั้งไว้



เปิดไฟล์นี้ด้วย โปรแกรม spreedsheet เช่น Excel หรือ LibreOffice Calc  โดยระบุให้ใช้เครื่องหมาย Comma เป็นตัวแบ่ง Field และ Character Set เป็น UTF-8



ซึ่งการระบุ เป็น UTF-8 จะแก้ปัญหาที่บางครั้งข้อมูลที่เป็นภาษาไทยพอ Convert จาก .csv ที่ได้มาแล้ว อ่านภาษาไทยไม่ออก

ถ้าทำทุกอย่างถูกต้อง เราจะเป็นข้อมูลที่เราได้ทำการค้นหา และ Export ออกมาเพื่อเอาไปใช้งานต่อ บนโปรแกรม spreadsheet  ได้แล้วครับ