如何从字符串中删除\(反斜杠)?

时间:2016-01-13 17:59:05

标签: perl email smtp

我编写了一个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 = 'pqr3853@gmail.com'   但邮件没有到达邮箱。根据日志,似乎电子邮件地址中的反斜杠导致了问题:

Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> MAIL FROM:<support@xyz3853.in>#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:<abc3853@gmail.com>#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: support@xyz3853.in#015
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> To: abc3853@gmail.com#015
Jan 13 09:20:10 cm cron: Net::SMTP=GLOB(0x98dc480)>>> Cc: pqr3853\@gmail.com#015

1 个答案:

答案 0 :(得分:0)

如果你在日志文件中查看几行:

MAIL FROM:<xyz@icmsg.in>#015
<abc@gmail.com>#015
DATA#015

这些行以#015结尾,看起来像octal 015,这是\r。在我看来,当您输出\r\n时,perl正在进行自动换行转换,因此\n会转换为\r\n,因此结果为\r\r\n,即& #39;是额外的\r,这是您日志文件中出现的内容。在你了解这些内容之前,这可能是无害的:

From: support@xyz3853.in#015
To: abc3853@gmail.com#015
Cc: pqr3853\@gmail.com#015

现在额外的\r字符看起来像是电子邮件地址的一部分。服务器是否知道应该在.in之后停止解析电子邮件地址?

docs中的示例使用\n来终止标头中的行,并在标头的末尾使用\n\n。从Net :: Cmd docs

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

这意味着要做的是将必要数量的\n个字符添加到一行的末尾。 datasend()处理将\n字符转换为\r\n以符合规范。

确认。我错过了这个:

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

你觉得问题是什么?什么是错误代码?