【问题标题】:Again: sending mail (through php) from an EC2 instance [closed]再次:从 EC2 实例发送邮件(通过 php)[关闭]
【发布时间】:2012-09-24 10:12:07
【问题描述】:

我已经看到很多关于使用 php 的邮件功能从亚马逊 EC2 实例发送邮件的问题的讨论。没有任何建议对我有用。

这是我的设置:

  • 我有 ubuntu EC2 实例。
  • 我按照亚马逊 SES 上的步骤使用为我创建的凭据安装 postfix。我尝试了 stunnel 和直接方法。
  • 我使用 swiftmail transport 根据this 发送邮件。发送邮件的传输函数返回 0 已投递。
  • 我单独使用了 php 邮件,它返回 true。但是,即使是垃圾邮件,也不会发送任何邮件。

顺便说一句,我没有在 SES 中使用生产服务。限制对我来说很好,我只想让它工作。

我怀疑我的身份验证不正确,我不明白为什么。我尝试远程登录 ...amazonaws.com 25 并且它已连接。但是当我在 telnet 中尝试命令 Mail From: ... 时,它说需要身份验证。

我已经想到了一个替代方案:sendgrid。对我来说太贵了。

有什么想法吗?

【问题讨论】:

  • 个人我有一个可行的解决方案,可以使用我的个人 google 帐户从我的 ec2 发送邮件,使用默认 linux 界面的 progs 可以访问。它运作良好。它符合您的需要吗?
  • @Offirmo 这是个好主意。但我最终还是使用了 SendGrid。我付钱,但至少它有效。如果您解释您的解决方案,它不会有害。
  • 好的,我稍后再添加。我也对你的 sendgrid 解决方案感兴趣,所以很划算;)

标签: amazon-ec2 postfix-mta php amazon-ses


【解决方案1】:

后缀的一种替代方法是使用“simple smtp”(ssmtp),它将提供其他程序/框架可能使用的工作sendmail。在此示例中,ssmtp 将通过 gmail 帐户发送电子邮件。

  1. 如果您还没有 gmail 帐户,请先打开一个 gmail 帐户
  2. 确保您绝对没有已经安装了 xmail 或 postfix 等并发邮件应用程序,否则会干扰
  3. 然后安装 ssmtp:sudo apt-get install ssmtp
  4. 然后编辑/etc/ssmtp/ssmtp.conf(见下文)
  5. 然后编辑/etc/ssmtp/revaliases(见下文)
  6. 然后测试:echo message content | sendmail -v test@something.com
  7. (可选)如果它不起作用,请查看日志:ll /var/log/mail.*cat ...

ssmtp.conf 的内容应该是:(取自我的 puppet 模块,用您的数据替换 部分)

root=<%= email %>
mailhub=smtp.googlemail.com:465
AuthUser=<%= email %>
AuthPass=<%= password %>
FromLineOverride=YES
UseTLS=YES

警告:conf 文件应该有 unix eols。

realiases 的内容应该是:

root:<%= email %>:smtp.googlemail.com:465

这种技术非常简单,但如果您需要发送数百封电子邮件,我想它不会扩展。

另一个优秀的链接(法语):http://doc.ubuntu-fr.org/ssmtp

【讨论】:

  • 这看起来很棒。我试试看。
【解决方案2】:

这是我使用 Sendgrid 从 EC2 实例使用 PHP 发送邮件的方法:

  1. 注册一个 Sendgrid 帐户。您将收到用于发送电子邮件的用户名和密码。此外,Sendgrid 将手动验证您的帐户(可能是为了防止垃圾邮件)。
  2. 在 ubuntu 中安装 PHP curl 库:sudo apt-get install php5-curl
  3. 使用此 PHP 代码发送电子邮件:

    $url = 'http://sendgrid.com/';
    $user = 'sendgrid_user';
    $pass = 'sendgrid_password'; 
    
    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to'        => $dest_addr,
        'subject'   => $subject,
        'html'      => $body,
        //'text'      => 'testing body',
        'from'      => $from_addr,
      );
    
    $request =  $url.'api/mail.send.json';
    
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
    
    // obtain response
    $response = curl_exec($session);
    
    //If the result is {"message":"success"}, then the mail is sent.  
    curl_close($session);
    

【讨论】:

  • 有趣。所以它不使用系统默认的邮件界面,但作为回报它非常简单。我会将此解决方案保存在我的工具箱中。它是否可以很好地处理向多个地址发送邮件?它是否允许访问收到的邮件?
  • @Offirmo 我仍在试验我的系统,所以我没有太多使用它。我用它将邮件发送到一个地址,但它一直快速可靠。我期待一些压力测试,尽管成本会阻止我做一些好的测试。
  • 好的,我期待更多的信息顺便说一句,接受你的答案作为答案,因为它解决了你的问题;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2017-05-09
  • 1970-01-01
  • 2012-04-13
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多