@@ -1673,3 +1673,133 @@ function is_imap_archive_folder($server_id, $user_config, $current_folder) {
16731673
16741674 return false ;
16751675}}
1676+
1677+ /**
1678+ * Error messages from spam reporting services
1679+ * @subpackage imap/functions
1680+ * @param string $error_msg Raw error message from service
1681+ * @return string User-friendly error message
1682+ */
1683+ if (!hm_exists ('normalize_spam_report_error ' )) {
1684+ function normalize_spam_report_error ($ error_msg ) {
1685+ $ error_mappings = array (
1686+ 'not enabled ' => 'SpamCop reporting is not enabled. Please enable it in Settings. ' ,
1687+ 'not configured ' => 'SpamCop submission email is not configured. Please configure it in Settings. ' ,
1688+ 'submission email ' => 'SpamCop submission email is not configured. Please configure it in Settings. ' ,
1689+ 'sender email ' => 'No sender email address configured. Please configure it in Settings. ' ,
1690+ 'No sender ' => 'No sender email address configured. Please configure it in Settings. ' ,
1691+ 'Failed to send email ' => 'Failed to send email to SpamCop. Please check your server mail configuration. ' ,
1692+ 'send email ' => 'Failed to send email to SpamCop. Please check your server mail configuration. '
1693+ );
1694+
1695+ foreach ($ error_mappings as $ key => $ message ) {
1696+ if (strpos ($ error_msg , $ key ) !== false ) {
1697+ return $ message ;
1698+ }
1699+ }
1700+
1701+ return $ error_msg ;
1702+ }}
1703+
1704+ /**
1705+ * Report spam message to SpamCop
1706+ */
1707+ if (!hm_exists ('report_spam_to_spamcop ' )) {
1708+ function report_spam_to_spamcop ($ message_source , $ reasons , $ user_config ) {
1709+ $ spamcop_enabled = $ user_config ->get ('spamcop_enabled_setting ' , false );
1710+ if (!$ spamcop_enabled ) {
1711+ return array ('success ' => false , 'error ' => 'SpamCop reporting is not enabled ' );
1712+ }
1713+
1714+ $ spamcop_email = $ user_config ->get ('spamcop_submission_email_setting ' , '' );
1715+ if (empty ($ spamcop_email )) {
1716+ return array ('success ' => false , 'error ' => 'SpamCop submission email not configured ' );
1717+ }
1718+
1719+ $ sanitized_message = sanitize_message_for_spam_report ($ message_source , $ user_config );
1720+
1721+ $ from_email = $ user_config ->get ('spamcop_from_email_setting ' , '' );
1722+ if (empty ($ from_email )) {
1723+ // Try to get from IMAP servers
1724+ $ imap_servers = $ user_config ->get ('imap_servers ' , array ());
1725+ if (!empty ($ imap_servers )) {
1726+ $ first_server = reset ($ imap_servers );
1727+ $ from_email = isset ($ first_server ['user ' ]) ? $ first_server ['user ' ] : '' ;
1728+ }
1729+ }
1730+
1731+ if (empty ($ from_email )) {
1732+ return array ('success ' => false , 'error ' => 'No sender email address configured ' );
1733+ }
1734+
1735+ $ reasons_text = implode (', ' , $ reasons );
1736+
1737+ $ subject = 'Spam Report: ' . $ reasons_text ;
1738+
1739+ $ body = "This email is being reported as spam for the following reasons: \n\n" ;
1740+ $ body .= $ reasons_text . "\n\n" ;
1741+ $ body .= "--- Original Message --- \n\n" ;
1742+ $ body .= $ sanitized_message ;
1743+
1744+ $ timeout = 10 ; //dont foget to add it to UI
1745+ $ old_timeout = ini_get ('default_socket_timeout ' );
1746+ ini_set ('default_socket_timeout ' , $ timeout );
1747+
1748+ try {
1749+ $ headers = array ();
1750+ $ headers [] = 'From: ' . $ from_email ;
1751+ $ headers [] = 'Reply-To: ' . $ from_email ;
1752+ $ headers [] = 'X-Mailer: Cypht Spam Reporter ' ;
1753+ $ headers [] = 'Content-Type: message/rfc822 ' ;
1754+
1755+ $ mail_sent = @mail ($ spamcop_email , $ subject , $ body , implode ("\r\n" , $ headers ));
1756+
1757+ ini_set ('default_socket_timeout ' , $ old_timeout );
1758+
1759+ if ($ mail_sent ) {
1760+ return array ('success ' => true );
1761+ } else {
1762+ return array ('success ' => false , 'error ' => 'Failed to send email to SpamCop ' );
1763+ }
1764+ } catch (Exception $ e ) {
1765+ ini_set ('default_socket_timeout ' , $ old_timeout );
1766+ return array ('success ' => false , 'error ' => $ e ->getMessage ());
1767+ }
1768+ }}
1769+
1770+ /**
1771+ * Sanitize message source for spam reporting
1772+ */
1773+ if (!hm_exists ('sanitize_message_for_spam_report ' )) {
1774+ function sanitize_message_for_spam_report ($ message_source , $ user_config ) {
1775+ $ user_emails = array ();
1776+ $ imap_servers = $ user_config ->get ('imap_servers ' , array ());
1777+ foreach ($ imap_servers as $ server ) {
1778+ if (isset ($ server ['user ' ])) {
1779+ $ user_emails [] = strtolower ($ server ['user ' ]);
1780+ }
1781+ }
1782+
1783+ // Split message into headers and body
1784+ $ parts = explode ("\r\n\r\n" , $ message_source , 2 );
1785+ $ headers = isset ($ parts [0 ]) ? $ parts [0 ] : '' ;
1786+ $ body = isset ($ parts [1 ]) ? $ parts [1 ] : '' ;
1787+
1788+ if (!empty ($ user_emails )) {
1789+ foreach ($ user_emails as $ email ) {
1790+ // Remove email from various headers
1791+ $ headers = preg_replace ('/\b ' . preg_quote ($ email , '/ ' ) . '\b/i ' , '[REDACTED] ' , $ headers );
1792+ }
1793+ }
1794+
1795+ // Remove sensitive headers
1796+ $ sensitive_headers = array ('X-Original-From ' , 'X-Forwarded-For ' , 'X-Real-IP ' );
1797+ foreach ($ sensitive_headers as $ header ) {
1798+ $ headers = preg_replace ('/^ ' . preg_quote ($ header , '/ ' ) . ':.*$/mi ' , '' , $ headers );
1799+ }
1800+
1801+ // Clean up multiple blank lines
1802+ $ headers = preg_replace ('/\r\n\r\n+/ ' , "\r\n\r\n" , $ headers );
1803+
1804+ return $ headers . "\r\n\r\n" . $ body ;
1805+ }}
0 commit comments