Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

message cloning and headers #28

Open
2 tasks done
weierophinney opened this issue Dec 31, 2019 · 4 comments
Open
2 tasks done

message cloning and headers #28

weierophinney opened this issue Dec 31, 2019 · 4 comments

Comments

@weierophinney
Copy link
Member

  • I was not able to find an open or closed issue matching what I'm seeing.
  • This is not a question. (Questions should be asked on chat (Signup here) or our forums.)

I have a service that has an injected default message. It has some default fields, such as encoding, from_name, from which are equal for any mail sent.

Internally it will create a clone from the default message and then it will add the actual rendered content, to subject. etc. It also adds Content-Type and an X-Header.

However at some point I noticed messages were having duplicate Content-Type and X-Header headers and some servers will deny those messages. Every time a message is sent and additional header is added. (this is a long running process)

Code to reproduce the issue

        $defaultMessage = new \Zend\Mail\Message();
        $defaultMessage->setFrom('[email protected]');

        $message1 = clone $defaultMessage;
        $message1->getHeaders()->addHeaderLine('X-Something', 1);

        $message2 = clone $defaultMessage;
        $message2->getHeaders()->addHeaderLine('X-Something', 2);

        print $message1->toString();
        print $message2->toString();

Expected results

Headers should be unique due to the clone of the default message

Date: Thu, 14 Jun 2018 08:53:20 +0000
From: [email protected]
X-Something: 1

Date: Thu, 14 Jun 2018 08:53:20 +0000
From: [email protected]
X-Something: 2

Actual results

Date: Thu, 14 Jun 2018 08:53:20 +0000
From: [email protected]
X-Something: 1
X-Something: 2

Date: Thu, 14 Jun 2018 08:53:20 +0000
From: [email protected]
X-Something: 1
X-Something: 2

I'm aware normally one should create a new Message for each Message you attempt to sent. I have changed my code to do this, but I still think this should simply work. I'm wondering why clone doesn't really clone...


Originally posted by @basz at zendframework/zend-mail#214

@weierophinney
Copy link
Member Author

ps. I'm on php72 and am using 2.10.0 of zend-mail (2.9 also had this)


Originally posted by @basz at zendframework/zend-mail#214 (comment)

@weierophinney
Copy link
Member Author

i've added in my project wrapper which implements __clone:

https://github.com/eventum/eventum/blob/v3.5.1/src/Mail/MailMessage.php#L651-L659

however it still doesn't work, so more deeper __clone() methods needed: eventum/eventum#364

probably need deeper clone in AddressList type headers, which have the address values as objects.

however, doing it properly would mean add __clone() in all objects themselves, not doing top level cloning.


Originally posted by @glensc at zendframework/zend-mail#214 (comment)

@weierophinney
Copy link
Member Author

I am under the impression that if you do not specify a __clone method a deep clone was performed by default?


Originally posted by @basz at zendframework/zend-mail#214 (comment)

@weierophinney
Copy link
Member Author

rather opposite:

http://php.net/manual/en/language.oop5.cloning.php

When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. Any properties that are references to other variables will remain references.

and as objects are always references in php5+, the result is that cloned subobjects remain shared.


Originally posted by @glensc at zendframework/zend-mail#214 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant