2016-01-13 84 views
-1

我寫了一個Perl腳本,它從數據庫中讀取電子郵件地址列表,並在cc字段中使用它們發送電子郵件。如何從字符串中刪除(反斜槓)?

my $ccList = (($acctType eq 1) ? $sfAdminEmail : $salesCcList); 
$ccList =~ s/\\//; 

$smtp->cc($ccList); 
$smtp->data(); 
$smtp->datasend("From: $supportEmail\r\n"); 
$smtp->datasend("To: $toAddress\r\n"); 
$smtp->datasend("Cc: $ccList\r\n"); 
$smtp->datasend("Subject: " .$subject. "\r\n"); 
$smtp->datasend("\r\n"); 

#Send the message. 
$smtp->datasend("$message"); 
$smtp->datasend("\r\n"); 
$smtp->dataend(); 

... 
... 

就該運行而言,$acctType = 0$salesCcList = '[email protected]' 但該消息未到達郵箱。基於日誌,似乎在電子郵件地址反斜槓導致問題:

Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> MAIL FROM:<[email protected]>#015 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)<<< 250 2.1.0 Ok 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> RCPT TO:<[email protected]>#015 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)<<< 250 2.1.5 Ok 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> DATA#015 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)<<< 354 End data with <CR><LF>.<CR><LF> 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> From: [email protected]#015 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> To: [email protected]#015 
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> Cc: pqr3853\@gmail.com#015 
+0

你已經有了替代品,看來。可能只是需要'/ g',但沒有看到你的輸入數據,這是不可能的。 –

+0

@MattJacob,最初{/ g}在那裏有着相同的結果。 –

+0

就像我說的,如果你希望得到高質量的答案,你需要[編輯]你的文章並創建[mcve]。 –

回答

0

如果你看看你的日誌文件中的幾行:

MAIL FROM:<[email protected]>#015 
<[email protected]>#015 
DATA#015 

行結束與#015,看起來像octal 015,這是一個\r。它看起來像我輸入\r\n時,perl正在執行自動換行轉換,所以\n轉換爲\r\n,因此結果是\r\r\n,即有一個額外的\r,這是出現在您的日誌文件中。

From: [email protected]#015 
To: [email protected]#015 
Cc: pqr3853\@gmail.com#015 

現在額外\r字符看起來是電子郵件地址的一部分:直到你將這些行這可能是無害的。請問服務器是否應該在.in之後停止解析電子郵件地址?

docs中的示例使用\n來終止標頭中的行,並在標頭的結尾處終止\n\n。而從網:: Cmd的docs

datasend (DATA) 
Send data to the remote server, converting LF to CRLF. 

這意味着正確的事情做的是的\n字符必要數量添加到行的末尾。 datasend()處理將\n字符轉換爲\r\n以符合規範。

Ack。我錯過了這個:

Cc: pqr3853\@gmail.com#015 
     ^
      | 

這是你認爲的問題是什麼?什麼是錯誤代碼?

+0

我認爲\導致了這個問題,因爲如果我從代碼中刪除'$ smtp-> datasend(「Cc:$ ccList \ r \ n」);',那麼它會到達** abc3853 @ gmail的收件箱.COM **。即使我將'ccList'硬編碼爲**[email protected]**,那麼它也可以工作。唯一的問題是,當我從數據庫中讀取'ccList'時,它會在'@'之前添加'\(反斜槓)',並且整個事件都會中斷。 –

+0

日誌中沒有錯誤代碼,cc已被簡單忽略。如果你看看上面提供的日誌,它會通過** 250 2.1成功傳遞'From'和'To'。5好**但沒有說'Cc' –

+0

@ paper.plane,全球替代是否解決了這個問題? – 7stud