我有一个扩展UserManager的服务,所以当我这样做时:
$message = \Swift_Message::newInstance()
->setSubject('~')
->setFrom('~')
->setTo('~')
->setBody('~', 'text/html');
$this->get('mailer')->send($message);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Fatal error: Call to undefined method My\MyBundle\Service\ServiceClass::get()
Run Code Online (Sandbox Code Playgroud)
我知道这是因为我需要将swiftmailer注入这里,但是如何?(通常服务类扩展'Generic',因此包含了swift邮件程序.)
我下载了SwiftMailer 4.1.6,用于使用Gmail发送电子邮件.我为此目的编写了以下代码.
<?php
require_once 'swiftmailer/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
->setUsername('jomit.jmt@gmail.com')
->setPassword('***********');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Wonderful Subject')
->setFrom(array('jomit.jmt@gmail.com' => 'Jomit Jose'))
->setTo(array('jomit.jmt@gmail.com' => 'Jomit Jose'))
->setBody('This is the text of the mail send by Swift using SMTP transport.');
$numSent = $mailer->send($message);
printf("Sent %d messages\n", $numSent);
Run Code Online (Sandbox Code Playgroud)
并导致以下错误:
Fatal error: Uncaught exception 'Swift_TransportException' with message
'Connection could not be established with host smtp.gmail.com
[Permission denied #13]' in
/home/jomit/public_html/email_test/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php:266
Stack trace:
#0 /home/jomit/public_html/email_test/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php(66):
Swift_Transport_StreamBuffer->_establishSocketConnection()
#1 /home/jomit/public_html/email_test/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(117):
Swift_Transport_StreamBuffer->initialize(Array)
#2 /home/jomit/public_html/email_test/swiftmailer/lib/classes/Swift/Mailer.php(79):
Swift_Transport_AbstractSmtpTransport->start()
#3 …Run Code Online (Sandbox Code Playgroud) 我不知道为什么我没有在我的控制器中捕获Swiftmailer的异常.我做错了什么,或者错过了什么?
在控制器中我有:
try {
$this->get('mailer')->send($email);
}
catch (\Swift_TransportException $e) {
$result = array(
false,
'There was a problem sending email: ' . $e->getMessage()
);
}
Run Code Online (Sandbox Code Playgroud)
在它到达我的代码之前它似乎被Symfony抓住了,所以我没有能够自己处理错误,而是获得标准的500页
Swift_TransportException: Connection could not be established
如果无法发送电子邮件,则不需要暂停应用程序,因为电子邮件并不重要 - 我只是想发出通知.
也许有办法禁用Symfonys捕获某些异常或某些控制器?
PHP和Swiftmailer的新手,还没有让它工作.我已将/ lib /目录上传到Hostgator共享Web服务器根目录中的目录.我在/ lib /上面的目录中上传了以下内容:
<?php
require_once 'lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('mail.****.com', 25)
->setUsername('****@****.com')
->setPassword('****');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Subject Here')
->setFrom(array('****@****.com' => '****'))
->setTo(array('****@****.com' => '****'));
$message->setBody('This is the message');
if (!$mailer->send($message, $errors))
{
echo "Error:";
print_r($errors);
}
?>
Run Code Online (Sandbox Code Playgroud)
它不发送消息,但我也无法查看任何错误日志.我在php.ini的所有部分都启用了错误日志记录 - 但是当我尝试转到我在浏览器中上传.php文件的位置时,我收到404错误.当我通过ssh连接时,我有jailshell访问权限.当我试图去/var/log/php-scripts.log时,我没有得到许可.想知道我还能在哪里找到错误来修复它?
我正在使用SwiftMailer从我的应用程序发送电子邮件.
到目前为止一切正常.我现在需要能够动态更改发件人的文本.下面的代码片段和下一段应该有希望澄清我的意思.
目前,我的代码如下所示:
try{
$message = Swift_Message::newInstance()
->setFrom($from)
->setTo($to)
->setSubject($subject)
->setBody($content);
$mailer->send($message);
}catch (Exception $e) {
// do something ...
}
Run Code Online (Sandbox Code Playgroud)
$ from变量包含发件人的电子邮件地址 - 即sysmail@mydomain.com
但是,我想为不同的实体(例如论坛,组等)发送每日摘要(例如),因此我希望能够将发件人的姓名文本设置为"论坛ABC成员每日摘要",即使发件人仍然是sysmailer@mydomain.com.我注意到linkedin正在做类似的事情 - 他们在不同的发件人名下发送不同的摘要,即使发件人总是group-digests@linkedin.com.
sysmailer@mydomain.com的默认名称是"System Mailer".顺便说一句,我使用Google Apps作为我的邮件服务提供商.设置不同的用户帐户对我来说是不切实际的,因为用户可以创建自己的论坛等.
有没有一种方法可以动态地(即通过代码)指定发件人名称,尽管使用相同的发件人电子邮件地址?
我想用跟踪器替换HTML电子邮件中的所有链接.据我所知,有这个EVENT_BEFORE_SEND事件.所以我创建了一些可以像下面这样使用的行为
$mailer = \Yii::$app->mailer;
/* @var $mailer \yii\mail\BaseMailer */
$mailer->attachBehavior('archiver', [
'class' => \app\MailTracker::class
]);
Run Code Online (Sandbox Code Playgroud)
这是MyTracker班级的内容.
class MailTracker extends Behavior {
public function events() {
return [
\yii\mail\BaseMailer::EVENT_BEFORE_SEND => 'trackMail',
];
}
/**
* @param \yii\mail\MailEvent $event
*/
public function trackMail($event) {
$message = $event->message;
$htmlOutput = $this->how_do_i_get_the_html_output();
$changedOutput = $this->changeLinkWithTracker($htmlOutput);
$message->getHtmlBody($changedOutput);
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是\yii\mail\BaseMailer没有提供在发送之前获取HTML输出的方法.
这该怎么做?
UPDATE
我能做到这一点的唯一方法是通过这种黑客方式.
/* @var $message \yii\swiftmailer\Message */
if ($message instanceof \yii\swiftmailer\Message) {
$swiftMessage = $message->getSwiftMessage();
$r = new …Run Code Online (Sandbox Code Playgroud) 如何在Yii2邮件程序中向多个收件人发送邮件?
此代码适用于多个收件人但无法正常工作.
$value = Yii::$app->mailer->compose()
->setFrom([$this->email => $this->name])
->setTo(array($model->email_1,$model->email_2))
->setSubject($model->status)
->setHtmlBody($model->description)
->send();
Run Code Online (Sandbox Code Playgroud)
如何在yii2邮件程序中添加setCc?
此代码用于添加setCc,但这也无效.
$value = Yii::$app->mailer->compose()
->setFrom([$this->email => $this->name])
->setTo($model->email_1)
->setCc($model->email_2)
->setSubject($model->status)
->setHtmlBody($model->description)
->send();
Run Code Online (Sandbox Code Playgroud) 我一直试图获取没有使用laravel Mail::send()函数获取电子邮件的收件人列表.我正在尝试下面的代码.for循环用作因为每个用户都要收到自定义消息.
// First recipient is actual, the second is dummy.
$mail_to_users = ["original_account@domain.com","dummy_account@domain.com"];
$failures = [];
foreach($mail_to_users as $mail_to_user) {
Mail::send('email', [], function($msg) use ($mail_to_user){
$msg->to($mail_to_user);
$msg->subject("Document Shared");
});
if( count( Mail::failures() ) > 0 ) {
$failures[] = Mail::failures()[0];
}
}
print_r($failures);
Run Code Online (Sandbox Code Playgroud)
我一直在尝试所有可能的选择.我将正确的邮件配置更改为错误的邮件配置config/mail.php.但是,如果我这样做,那么laravel显示错误页面,但$failure变量总是返回空.
我们的电子邮件无法使用Redis Queue使用Laravel发送.
触发错误的代码是: ->onQueue('emails')
$job = (new SendNewEmail($sender, $recipients))->onQueue('emails');
$job_result = $this->dispatch($job);
Run Code Online (Sandbox Code Playgroud)
结合这项工作:
use InteractsWithQueue;
Run Code Online (Sandbox Code Playgroud)
我们的错误信息是:
Feb 09 17:15:57 laravel: message repeated 7947 times: [ production.ERROR: exception 'Swift_TransportException' with message 'Expected response code 354 but got code "550", with message "550 5.7.0 Requested action not taken: too many emails per second "' in /home/laravel/app/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:383 Stack trace: #0 /home/laravel/app/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(281):
Run Code Online (Sandbox Code Playgroud)
我们的错误只发生在使用Sendgrid而不是Mailtrap,这会欺骗电子邮件发送.我和Sendgrid谈过,电子邮件从未触及他们的服务器,当我的错误发生时,他们的服务完全处于活动状态.所以,错误似乎在我的最后.
有什么想法吗?